The goal of 8 Queens Problem is to put eight queens on a chess-board such that none of them threatens any of others. A queen threatens the squares in the same row, in the same column, or on the same diagonals as shown in the following figure.
For a given chess board where k
queens are already placed, find the solution of the 8 queens problem.
Input
In the first line, an integer k
is given. In the following k lines, each square where a queen is already placed is given by two integers r and c. r and crespectively denotes the row number and the column number. The row/column numbers start with 0.
Output
Print a 8×8
chess board by strings where a square with a queen is represented by 'Q' and an empty square is represented by '.'.
Constraints
- There is exactly one solution
Sample Input 1
2 2 2 5 3
Sample Output 1
......Q. Q....... ..Q..... .......Q .....Q.. ...Q.... .Q...... ....Q...
#include<stdio.h>
#include<string.h>
#define N 8
int mp[N][N],row[N],col[N],dneg[2*N-1],dops[2*N-1];
void init()
{
for(int i=0; i<N; i++)
row[i]=col[i]=0;
for(int i=0; i<2*N-1; i++)
dneg[i]=dops[i]=0; //对角线
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
mp[i][j]=0;
}
void check()
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
if(mp[i][j])
{
if(row[i]!=j)
return ;
}
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
printf("%c",(row[i]==j)?'Q':'.');
}
printf("\n");
}
return ;
}
void dfs(int i)
{
if(i==N)
{
check();
return ;
}
for(int j=0; j<N; j++)
{
if(col[j] || dops[i+j] || dneg[i-j+N-1]) continue;
row[i]=j;
col[j]=dops[i+j]=dneg[i-j+N-1]=1;
dfs(i+1);
row[i]=col[j]=dops[i+j]=dneg[i-j+N-1]=0;
}
}
int main()
{
int k,r,c;
while(~scanf("%d",&k))
{
init();
for(int i=0; i<k; i++)
{
scanf("%d%d",&r,&c);
mp[r][c]=1;
}
dfs(0);
}
return 0;
}