LeetCode-NQueensII

经典的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 };

 

 

posted @ 2013-09-12 12:36  Exio  阅读(289)  评论(0编辑  收藏  举报