算法——二进制解决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循环