算法——二进制解决N皇后(超级酷炫o((>ω< ))o

先贴代码:

public class Solution {

    void NQueen(int N, int row, int col, int pie, int na, int[] res) {
        if (row == N) {
            res[0]++;
            return;
        }int bits = (~(col | pie | na))&((1<<N)-1);
        while (bits > 0) {
            int p = bits&(-bits);
            NQueen(N, row+1, col|p, (pie|p)<<1, (na|p)>>1, res);
            bits &=(bits-1);
        }
    }

    public int totalNQueens(int n) {
        int[] res = new int[1];
        NQueen(n, 0, 0, 0, 0, res);
        return res[0];
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.totalNQueens(4));
    }
}

这里稍微解释一下:

int bits = (~(col | pie | na))&((1<<N)-1); 
//这句的用处是获得当前行能放皇后的位置(比特位来表示,1表示能放皇后,2表示不能) col pie na 中的比特位1表示有皇后攻击 0表示没有皇后攻击。
三个数取或运算得到所有被攻击的位置,取反后与棋盘长度做与运算将
棋盘长度外的比特位置零;
int p = bits&(-bits);
//这句话得到了bits中末尾的1的位置对应的整数,换句话说,其实就是打算从右到左取比特位为1的位置进行递归;
bits &=(bits-1);
//上一步已经把最左边的位置进行了递归,所以这次就要把最左边这个比特位的1踢掉,准备下一次while循环

posted @ 2019-05-14 22:48  高圈圈  阅读(321)  评论(0编辑  收藏  举报