C++ 代码
第一种写法
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=20;
int n;
char g[N][N]; //存放的是数组的状态
bool mdg[N],sdg[N],col[N]; //mdg是主对角线,sdg是副对角线,col是每一列
void dfs(int u){
if(u>n){ //u代表第u行,如果u比n大,说明每行都遍历完了
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%c",g[i][j]);
}
puts("");
}
puts("");
return;
}
for(int i=1;i<=n;i++){ //到第u行的时候遍历该行的第i列,主副对角线是否有皇后
if(!col[i] && !mdg[u+i] && !sdg[N-u+i]){ //如果没有,就把当前位置放上皇后
g[u][i]='Q';
col[i]=mdg[u+i]=sdg[N-u+i]=true; //代表该位置已经有了皇后
dfs(u+1);
col[i]=mdg[u+i]=sdg[N-u+i]=false; //恢复现场
g[u][i] = '.'; //恢复现场
}
}
}
int main(){
memset(g,'.',sizeof g);
scanf("%d",&n);
dfs(1);
return 0;
}
第二种写法
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=10;
int n;
char g[N][N];
bool col[N],row[N],mdg[N*N],sdg[N*N];
void dfs(int x,int y,int s){ //x和y代表当前位置,s用来存储当前皇后的个数
if(y>n) x++,y=1;
if(x>n){
if(s==n){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) printf("%c",g[i][j]);
puts("");
}
puts("");
}
return;
}
if(!col[y] && !row[x] && !mdg[x+y] && !sdg[n-x+y]){
g[x][y]='Q';
col[y]=row[x]=mdg[x+y]=sdg[n-x+y]=true; //true代表当前点所在的行、列、主副对角线上已经有了皇后
dfs(x,y+1,s+1); //放皇后
col[y]=row[x]=mdg[x+y]=sdg[n-x+y]=false; //恢复现场
g[x][y]='.';
}
// 不放皇后
dfs(x,y+1,s);
g[x][y]='.';
}
int main(){
scanf("%d",&n);
memset(g,'.',sizeof g); //给g数组中的所有元素赋值为 '.'
dfs(1,1,0);
return 0;
}