对于N*N的方格,放置皇后,每行一个开始枚举,
依次放置,若与前面的放置情况不冲突,递归下去,直至放到N+1行,更新方案数
#include <cstring>
#include <cstdio>
int num;
int f;
int a[15];//a[i]的值表示第i行放置的位置,a[i]=m,则表示第i行放在第m个位置
void trial(int i)
{
if(i == f+1)
{
num++;
return;
}
else
{
for(int m=1;m<=f;m++)//枚举每次放置的位置数(一行里面的第几个)
{
a[i] = m;
int ok = 1;//先假定可以放置在第m个位置
for(int j=1;j<i;j++)//判断与之前的情况是否冲突
if(a[i]==a[j]||i-a[i]==j-a[j]||i+a[i]==j+a[j])
{//是否同列,与边缘成45度角
ok = 0;
break;
}
if(ok)//如果可行,递归下一行的放置
trial(i+1);
}
}
}
int main()
{
int x[11];
int N;
for( f=1;f<=10;f++)//预处理不同规格的方格
{
num=0;
trial(1);
x[f]=num;
}
while(scanf("%d",&N),N)
{
printf("%d\n",x[N]);
}
return 0;
}
hdu 2553 N皇后问题
最新推荐文章于 2025-04-21 08:47:29 发布