题目链接:https://www.acwing.com/problem/content/845/
- 枚举每一行,判断列,对角线是否满足条件
#include<iostream>
#include<cstdio>
using namespace std;
const int N=20;
char g[N][N];
bool st[N], dg[2*N], udg[2*N];
int n;
void dfs(int u){
if(u==n){
for(int i=0;i<n;i++) puts(g[i]);
puts("");
return;
}
for(int i=0;i<n;i++){
if(!st[i]&&!dg[u+i]&&!udg[u-i+n]){
st[i]=dg[u+i]=udg[u-i+n]=1;
g[u][i]='Q';
dfs(u+1); //当这一行出现了满足条件的放法,才会往下行搜索
st[i]=dg[u+i]=udg[u-i+n]=0;
g[u][i]='.';
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i][j]='.';
dfs(0);
return 0;
}
- 枚举每个格子,有放与不放两种选择,在符合条件的位置上选择放置,这个需要要判断最后放置的个数到不到n个
#include<iostream>
#include<cstdio>
using namespace std;
const int N=20;
char g[N][N];
bool col[N],row[N],eg[2*N], ueg[2*N];
int n;
void dfs(int x, int y, int s){
if(y==n) y=0, x++;
if(x==n){
if(s==n){
for(int i=0;i<n;i++) puts(g[i]);
puts("");
}
return ;
}
//不放
dfs(x,y+1,s);
//放
if(!col[y]&&!row[x]&&!eg[x+y]&&!ueg[x-y+n]){
g[x][y]='Q';
col[y]=row[x]=eg[x+y]=ueg[x-y+n]=1;
dfs(x,y+1,s+1);
g[x][y]='.';
col[y]=row[x]=eg[x+y]=ueg[x-y+n]=0;
}
}
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);
return 0;
}