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,表示都能用,左移右移都补零.
        }
    }
};