n-皇后问题(bfs)
#include<iostream>
using namespace std;
const int N=20;//N*N 两倍
int n;
bool col[N],dg[N],udg[N];//同一列,对角线,反对角线(标记一下是否可以走)
//udg 副对角线 /
//英语单词 column 列 diagonal 主角线 \
//row 行
char g[N][N];//记录地图
void dfs(int row){//row表示深度 深度优先遍历函数。参数u:从第u(y)行开始放棋子,处理第row行。
if(row==n){//递归结束判定:当 row== n的时候,说明应该处理第 n行了,也代表第 0~n-1行放好棋子,也就是整个棋盘放好了棋子,也就是得到了一种解,也就是递归结束。
for(int i=0;i<n;i++)
{
for(int j = 0; j < n; j++)
cout << g[i][j];
cout << endl;
}
cout << endl;
return;
}
for(int i=0;i<n;i++){//第 row行,第 i 列 是否放皇后
if(!col[i] && !udg[row+i] && !dg[row-i+n]){//是不在同一列,对角线或者反对角线上的路 udg[i + u] 表示 u行i列处,所在的反对角线上有没有棋 dg[u - i + n]表示 u行i列处,所在的对角线上有没有棋子,如果 u行i列的对角线,反对角线上都没有棋子,即!cor[i] && !udg[i + u] && !dg[u-i+n]为真,则代表 u行i列处可以放棋子。
g[row][i]='Q';//这条路可以走,放皇后
col[i]=udg[row+i]=dg[row-i+n]=true;//这条路已经不能走了,对应的列, 斜线状态改变
dfs(row+1);//遍历下一层
col[i]=udg[row+i]=dg[row-i+n]=false;//回溯恢复状态 恢复现场
g[row][i]='.';
}
}
}
int main(){
cin>>n;
//先输入地图
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]='.';//初始化全部空格子
dfs(0);//从(0,0)开始找
}