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)开始找

}

 

posted @ 2023-03-14 20:39  chenxinyue  阅读(23)  评论(0编辑  收藏  举报