N皇后问题,位运算思路来自matrix67
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define LL long long
LL uplimit,sum;
void doans(LL r, LL ld, LL rd)
{
if(r != uplimit)
{
LL pos = uplimit & ~(r | ld | rd);
while(pos != 0)
{
int p = pos & (~pos + 1);
pos -= p;
doans(r + p, (ld + p) << 1, (rd + p) >> 1);
}
}
else sum++;
}
main()
{
LL n;
while(scanf("%I64d",&n)!=EOF&&n)
{
sum=0;
uplimit = (1 << n) - 1;
doans(0,0,0);
printf("%I64d\n",sum);
}
}