经典的N皇后问题,
这里学到了一个非常牛的新方法(http://www.matrix67.com/blog/archives/266),用位运算来求解N皇后问题;
思路其实也很容易懂,一点都不复杂,
同样是遍历每一行的每一列,只不过所有冲突的位置都用bit位置记录下来了,
首先考虑在第k行的第j列放一个皇后,那么第k + 1行的第j - 1列和 j +1列都会与该皇后冲突,
用位运算的左右移位就能表示所有列的有冲突的位置,那么在选择第k + 1行的放置位置的时候就只能选择
无冲突的位置。
1 class Solution { 2 public: 3 int totalNQueens(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int res = 0; 7 getNQueens(res, n, 0, 0, 0); 8 return res; 9 } 10 void getNQueens(int &res, int n, int row, int ld, int rd) { 11 if (row == (1 << n) - 1) { 12 ++res; 13 return; 14 } 15 int pos = ~(row | ld | rd); 16 for (int i = 0; i < n; ++i) { 17 int p = 1 << i; 18 if (pos & p) { 19 getNQueens(res, n, row | p, (ld | p) << 1, (rd | p) >> 1); 20 } 21 } 22 } 23 };