class Solution {
public:
/**
*
* @param n int整型 the n
* @return int整型
*/
int count_ = 0;
int Nqueen(int n) {
dfs(n, 0, 0, 0, 0);
return count_;
}
void dfs(int n, int row, int shu, int pie, int na){
int available = ((1 << n) - 1) & ~(shu | pie | na); //找到这一行所有能够放置棋子的位置,二进制数,1的地方就能放.
while(available){
int p = available & -available; //获取最右侧的第一个1
available ^= p; //清除这个1
if(row == n-1) ++count_; //要是到最后一行了,就增加总数
else dfs(n, row + 1, shu | p, (pie | p) >> 1, (na | p) << 1); //撇和捺最开始都是0,表示都能用,左移右移都补零.
}
}
};