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;

}

该方法使用了许多为了缩减时间的算法共用的位运算,在此之前,我对位运算的接触不多,只是有过几次简单了解,而本次对其利用,也是建立在学习他人代码的基础上,基本了解了位运算在该问题中的使用。

posted @ 2020-03-30 16:06  BlueValentines  阅读(102)  评论(0)    收藏  举报