#include<stdio.h>
#include<string.h>
int n,i,j,k,a[5][30],tot=0;
void dfs(int cur){//搜索到了第几行
if(cur==n+1) tot++;//超出边界表示一轮搜索完成
else for(int i=1;i<=n;i++){
if(a[0][i]==0&&a[1][i+cur]==0&&a[2][i-cur+n]==0){//a[0][i]==0 对同列判重,a[1][i+cur]==0 对副对角线判重,a[2][i-cur+n]==0对主对角线判重
a[0][i]=1;a[1][i+cur]=1;a[2][i-cur+n]=1;
dfs(cur+1);
a[0][i]=0;a[1][i+cur]=0;a[2][i-cur+n]=0;
}
}
}
int main(){
freopen("1295.in","r",stdin);
freopen("1295.out","w",stdout);
scanf("%d",&n);
memset(a,0,sizeof(a));
dfs(1);
printf("%d",tot);
return 0;
}
第七天
盲点:列a[0][],主斜行a[1][],副斜行a[2][],判断合法。
注意dfs递归后将访问标记a[1],a[2],a[3]清零