#include <iostream>
using namespace std;
long int upperlim;
long int sum;
//row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放
void test(long int row,long int ld,long int rd)
{
long int pos,p;
if(row!=upperlim)
{
pos=upperlim&(~(row|ld|rd));
while(pos!=0)
{
p=pos&(-pos);//-pos相当于 (!pos+1)结果是取出最右边的那个1。这样,p就表示该行的某个可以放子的位置
pos=pos-p; //把它从pos中移除
test(row+p,(ld+p)<<1,(rd+p)>>1); //递归调用这个过程
}
}
else sum++;
}
int main(void)
{
upperlim=(1<<8)-1;
test(0,0,0);
printf("%d",sum);
return 0;
}