hdu 2553 N皇后问题

对于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值