首先,n皇后问题问的是满足所有条件的棋子摆法。
显而易见若要满足条件,那么对于每个皇后,她所处的行,列,以及两个对角线上不能有其他皇后,否则就不满足条件。因此我们可以通过列举每一行皇后的位置情况来模拟八皇后问题,当我们列举下一行皇后情况时,她的情况是取决于先前行的皇后摆放情况的,所以只要循环一行上的所有位置再通过DFS(优先深度搜索)来判定其他行的皇后情况即可。
详细功能实现看代码:
#include<iostream>
using namespace std;
const int N=20;
char chess[N][N];
bool col[N],dg[N],udg[N]; //分别代表列,与两条对角线(由于是循环每一行,所以一行只有一个皇后,无需再开关于行的bool数组)
int n;
void dfs(int y){
if(y==n){ //如果搜到最后一层,即完成一种情况
for(int i=0;i<n;i++){
puts(chess[i]);
}
puts("");
return;
}
for(int i=0;i<n;i++){
if(!col[i]&&!dg[i+y]&&!udg[n+y-i]){ //如果该位置满足条件,则放皇后
chess[y][i]='Q';
col[i]=dg[i+y]=udg[n+y-i]=1;
dfs(y+1); //注意DFS的核心思想是回溯,在列举完每一行的一种情况后,应该将dfs过程中修改的值回溯到原来状态,否则会影响一行的下一种情况,同时由于循环的变化性,情况是不会重复的。
col[i]=dg[i+y]=udg[n+y-i]=0;
chess[y][i]='.';
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++) chess[i][j]='.';
}
dfs(0);
return 0;
}