解析
经典大法师(dfs哈哈哈)
比较关键的是每条对角线上点的坐标之和或差是相同的,故可以用一维数组存储其状态
这题一开始用了双层循环,卡掉了4个点qwq
后来发现其实因为每行只有一个皇后,每次单层循环枚举j就可以实现的
于是代码就出来了
代码
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int y[50]={ },he[50]={ },ca[50]={ },tot=0,ans[20];
int n;
void dfs(int num,int I){//I记录放到第几个皇后(第几行)
if(num>n){
tot++;
if(tot<=3){
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
printf("\n");
}
return;
}
for(int j=1;j<=n;j++){//这里只需要单层即可
if(y[j]==0&&he[I+j]==0&&ca[I-j+n]==0){
y[j]=1;
he[I+j]=1;
ca[I-j+n]=1;
ans[num]=j;
dfs(num+1,I+1);
y[j]=0;
he[I+j]=0;
ca[I-j+n]=0;
}
}
return;
}
int main() {
scanf("%d",&n);
dfs(1,1);
printf("%d",tot);
return 0;
}