NOJ1267 N皇后(非位运算)

/*NQueen问题如果用简单的条件(即每次准备在第i行上找摆皇后的位置的时候,就从第i行的第0列到第n列
依次找符合条件的点(看和前面已经摆好皇后的i-1个皇后比较,看是否在同一列上是否在同一主对角线或
者副对角线上))搜索,这个过程耗时较多。解决方法:每放一个皇后,就将该皇后所在位置的列号作为
lie[]数组的下标,并将lie数组的该元素置为1,因为在矩阵中的特性(平行于主对角线的直线上的点的
横、纵坐标之差为定值(这边要加上n,因为数组下标没有负数),平行于主对角线的直线上的点的横、纵
坐标之和为定值),所以可以将摆皇后的位置的横、纵坐标的差以及和分别作为zhu[]和fu[]数组的下标,
并将之置为1,但是在改点的回溯完成后要讲因为在该点摆皇后所产生的lie、zhu、fu数组对应下标的元素
的值置0,因为这题要的是所有结果方案数*/

 

#include<stdio.h>
#include<stdlib.h>
#define N 25

int n,top,lie[N],zhu[N],fu[N];
int search(int cur)
{         
 int i,j,k;
 if(cur>n)
  {
   top++;
   return 0;
  }
 else
  for(i=1;i<=n;i++) 
   {
    if(!lie[i]&&!zhu[cur-i+n]&&!fu[cur+i])
     {
      lie[i]=zhu[cur-i+n]=fu[cur+i]=1;  
      search(cur+1);
      lie[i]=zhu[cur-i+n]=fu[cur+i]=0; 
     }      
   }
 return 0;
}
int main()
{
 while(scanf("%d",&n)&&n!=0)
  {
     top=0;
   search(1);
     printf("%d/n",top);
  }
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值