n皇后(位)。。。
位运算快速版:
#include<iostream>
using namespace std;
long sum,upperlim=1;
void test(long row,long ld,long rd)
{
if(row!=upperlim)
{
long pos=upperlim&~(row|ld|rd); //求取当前哪些列可以放置皇后。
while(pos)
{
long p=pos&-pos; //取得可以放皇后的最右边的列。
pos-=p; //将pos最右边为1的bit清零。
test(row+p,(ld+p)<<1,(rd+p)>>1); //对下一行放置限制:row+p为当前列,(ld+p)<<1为左边相邻的列,(ld+p)>>1为右边相邻的列。
}
}
else sum++;
}
int main(int argc,char *argv[])
{
int n;
while(1)
{
cin>>n;
if(n==0) break;
sum=0;
upperlim=1;
if(argc!=1) n=atoi(argv[1]); //转型存储。
upperlim=(upperlim<<n)-1;
test(0,0,0);
printf("%ld\n",sum);
}
return 0;
}
该方法使用了许多为了缩减时间的算法共用的位运算,在此之前,我对位运算的接触不多,只是有过几次简单了解,而本次对其利用,也是建立在学习他人代码的基础上,基本了解了位运算在该问题中的使用。

浙公网安备 33010602011771号