#include<iostream>
using namespace std;
const int N=20;
int n;
char g[N][N];
bool col[N],dg[N],udg[N];
void dfs(int u)
{
if(u==n)
{
for (int i=0;i<n;i++) puts(g[i]);
puts("");
return;
}
for(int i=0;i<n;i++)
if(!col[i]&& !dg[u+i] && !udg[n-u+i])
{
g[u][i]='Q';
col[i]=dg[u+i]=udg[n-u+i]=true;
dfs(u+1);
col[i]=dg[u+i]=udg[n-u+i]=false;
g[u][i]='.';
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
g[i][j]='.';
}
}
dfs(0);
return 0;
}
我们来观察几条正对角线:
以 n = 4
的棋盘为例:
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)
(3,0) (3,1) (3,2) (3,3)
对于u+i
- 左上角
(0, 0)
这条对角线,0 + 0 = 0
; - 包含
(0, 1)
和(1, 0)
的对角线,0 + 1 = 1
,1 + 0 = 1
; - 包含
(0, 2)
、(1, 1)
和(2, 0)
的对角线,0 + 2 = 2
,1 + 1 = 2
,2 + 0 = 2
;
对于n-u+i
- 右上角
(0, 3)
这条对角线,4 - 0 + 3 = 7
; - 包含
(0, 2)
和(1, 3)
的对角线,4 - 0 + 2 = 6
,4 - 1 + 3 = 6
; - 包含
(0, 1)
、(1, 2)
和(2, 3)
的对角线,4 - 0 + 1 = 5
,4 - 1 + 2 = 5
,4 - 2 + 3 = 5
; - 以此类推。