题目太经典 不描述了
#include <iostream>
using namespace std;
#define N 20
char g[N][N]; //棋盘每个方格的状态 需初始化为'.'
bool col[N],dg[N],udg[N]; //初始0 表示该col、dg、udg上还没被放
int n;
void dfs(int u) //探索第u个皇后/第u行
{
if(u-1==n) //因为是dfs(u+1)过来的 所以给它减回去
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<g[i][j];
}
cout<<endl;
}
cout<<endl; //每个方案之后空行
}
else
{
int x=u;
for(int y=1;y<=n;y++) //y来搜索x行上的每一列 探索当前皇后u(x)能放到哪一列
{
if(!col[y]&&!dg[y-x+n]&&!udg[y+x])
{
col[y]=dg[y-x+n]=udg[y+x]=1;
g[x][y]='Q';
dfs(u+1);
g[x][y]='.';
col[y]=dg[y-x+n]=udg[y+x]=0;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
g[i][j]='.';
}
}
dfs(1);
}