#include <stdio.h>
#include <math.h>
int main()
{
int a[12],b[12],m;
int fg,k,i,s,n;
for(n=1;n<=10;n++)
{
a[1]=1;s=0;i=1;
while(1)
{
fg=1;
for(k=i-1;k>=1;k--)
if(a[i]==a[k]||fabs(a[i]-a[k])==i-k) //处理对角线。
fg=0; // 标记为不满足。
if(fg==1&&i==n)
s++;
if(i<n&&fg==1) //上面检查本行都满足, 应该放到应该放到下一行。
{
i++;
a[i]=1; //当从新的一行开始时,应回到上面检查是否满足条件。
continue;
}
while(a[i]==n&&i>1)
i--; //本行放到最后一个还不满足, 回溯到上一行。
if(i==1&&a[i]==n) //如果上一行a[i] == n, 表示所有可能都一列举。
break;
else
a[i]=a[i]+1; //上一行向右移动一位, 查看舒服满足。
}
b[n]=s;
}
while(scanf("%d",&m)!=EOF&&m!=0)
{
printf("%d\n",b[m]);
}
return 0;
}
N皇后问题
最新推荐文章于 2022-12-01 10:22:27 发布