public class NQueue {
public static void main(String[] args) {
int n = 8;
//int limit = n == 32 ? -1 :(1<<n)-1;
System.out.println(num2(n));
}
public static int num2(int n){
if(n < 1 || n>32){
return 0;
}
// 1<<n: 1向左移动n位, 这样1后面有n个零,然后减去1,这样最右边就有n个1
int limit = n == 32 ? -1 :(1<<n)-1;
return process2(limit, 0,0,0);
}
public static int process2(int limit,
int colLim,
int leftDiaLim,
int rightDiaLim){
if(limit == colLim){
return 1;
}
int pos = limit & (~(colLim | leftDiaLim | rightDiaLim));
int mostRightOne = 0;
int res = 0;
while(pos != 0){
mostRightOne = pos & (~pos + 1);
pos = pos-mostRightOne;
int nColLim = colLim+mostRightOne;
int nLeftDiaLim = (leftDiaLim+mostRightOne)<<1; // 左移1位
int nRightDiaLim = (rightDiaLim+mostRightOne)>>1; // 右移1位
res += process2(limit, nColLim,nLeftDiaLim,nRightDiaLim);
}
return res;
}
}