题目要求
思路分析
题目要求棋盘的每行每列和对角线不能有两个皇后,所以设置三个标志位用来标记这个元素所在的三个位置有无元素,然后使用dfs遍历即可。
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
bool col[N],dg[N],udg[N];
int n;
char g[N][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])
{
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);
}
上述代码如果看不懂,可以看
彻底搞懂回溯法以上博文非常详细的介绍了dfs的使用