$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 递归每一行,枚举每一列,符合,放皇后递归下一层,不符合,剪枝回到上一层
2. col[i] 表示 i-1 列,dg[u + i] 与 udg[n + u - i - 1] 对应
完整代码
#include<bits/stdc++.h>
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++) cout<<g[i]<<endl;
cout<<endl;
return;
}
//枚举每一列
for(int i=0;i<n;i++)
if(!col[i]&&!dg[u+i]&&!udg[n+u-i-1])
{
g[u][i]='Q';
col[i]=dg[u+i]=udg[n+u-i-1]=true;
dfs(u+1);
//恢复现场
g[u][i]='.';
col[i]=dg[u+i]=udg[n+u-i-1]=false;
}
}
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;
}