搜索每一行
#include<bits/stdc++.h>
using namespace std;
const int N=20;//对角线上位置的个数是2n
int n;
char a[N][N];//地图
//开三个数组分别记录状态
bool col[N],dg[N],udg[N];//列,反对角线(右上到左下),正对角线(左上到右下)
void dfs(int x){
if(x==n){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cout<<a[N][N];
return ;
}
for(int i=0;i<n;i++){
if(!col[i] && !dg[x+i] && !udg[n-x+i]){//同一条对角线上横纵坐标相加的值都是相等的
a[x][i]='Q';
col[i]=dg[x+i]=udg[n-x+i]=true;
dfs(x+1);
col[i]=dg[x+i]=udg[n-x+i]=false;
g[x][i]='.';
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]='.';
dfs(0);
return 0;
}
搜索每个位置
#include<bits/stdc++.h>
using namespace std;
const int N=20;//对角线上位置的个数是2n
int n;
char a[N][N];//地图
//开三个数组分别记录状态
bool row[N],col[N],dg[N],udg[N];//行,列,反对角线(右上到左下),正对角线(左上到右下)
void dfs(int x,int y,int s){
if(y==n) y=0,x++;//每一行最后一个y时,行+1,列=0
if(x==n){
if(s==n){
for(int i=0;i<n;i++) puts(g[i]);
puts("");
}
return ;
}
//不放皇后
dfs(x,y+1,s);
//放皇后
for(int i=0;i<n;i++){
if(!row[x] && !col[y] && !dg[x+y] && !udg[x-y+n]){//同一条对角线上横纵坐标相加的值都是相等的
g[x][y]='Q';
row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
dfs(x,y+1,s+1);
row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
g[x][y]='.';
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]='.';
dfs(0,0,0);
return 0;
}