题目链接:https://leetcode.com/problems/n-queens-ii/
N皇后问题的位运算实现。
1 class Solution 2 { 3 public: 4 int totalNQueens(int n) 5 { 6 upperLimit = (1 << n) - 1; //如果n为8,则upperLimit为"11111111"。 7 placeQueen(0, 0, 0); 8 9 return count; 10 } 11 12 void placeQueen(int down, int left, int right) //down : 正下方 / left : 左下方 / right : 右下方。 13 { 14 int availableBits = 0; //availableBits中为"1"的位,表示这个位置可以放置皇后。 15 16 if (down == upperLimit) //所有位置的下方都放置了一个"1",即所有位置摆放完毕。 17 { 18 ++count; 19 } 20 else 21 { 22 //(down | left | right)中的"1"表示被其他皇后占用的位置,取反后,"1"表示可以放置皇后的位置。 23 availableBits = upperLimit & (~(down | left | right)); 24 while (availableBits) 25 { 26 //取出availableBits中最右边的一个"1",如availableBits = "11110000",则结果为"00010000" 27 //将下一个皇后放置在这个"1"的位置,并且将availableBits去掉这个"1"。 28 int nextQueen = availableBits & (-availableBits); 29 availableBits -= nextQueen; 30 31 //递归调用,放置下一个皇后,考虑对下一行的影响: 32 //状态变为(down | nextQueen, (left | nextQueen) << 1, (right | nextQueen) >> 1)。 33 //在左对角线上的影响,对应于左下的位置;在右对角线上的影响,对应于右下的位置。 34 placeQueen(down | nextQueen, (left | nextQueen) << 1, (right | nextQueen) >> 1); 35 } 36 } 37 } 38 39 int upperLimit = 0; 40 int count = 0; 41 };