P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<stdio.h>
int a[100],lie[100],z[100],r[100];//a[i]=j:第i行的皇后在这一行的第j个位置(记答案用)皇后所在的位置在(i,j)。标记数组:lie[i]:第i列 。z[],r[]:左右斜线标记
int sum,n;
void dfs(int s){//s为当前要放皇后的行数
if(s>n){
if(sum<3)
{for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);}//顺序输出第i行的皇后位置a[i]
printf("\n");
}
sum++;
return ;
}
else{
for(int i=1;i<=n;i++)
{
if(lie[i]==0&&z[s+i]==0&&r[s-i+n]==0)//如若该位置所在的列,左右斜对角线都未被标记,就可以放皇后
{
a[s]=i;//记录皇后位置,第s行皇后位于(s,i)位置
lie[i]=1;//放下皇后之后要把其所在列,左右对角线全部标记
z[s+i]=1;
r[s-i+n]=1;
dfs(s+1);//放下一行
lie[i]=0;//回溯
z[s+i]=0;
r[s-i+n]=0;
}
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
printf("%d\n",sum);
return 0;
}