public class sdf {
static int upperlim;
static int sum;
//static //row、ld和rd,分别表示在纵列和两个对角线方向的限制条件下这一行的哪些地方不能放
static void test( int row, int ld, int rd)
{
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++;
}
public static void main (String args [])
{
upperlim=(1<<8)-1;
test(0,0,0);
System.out.println(sum);
}
}