LeetCode 每日一题 51.N 皇后

51.N 皇后

题目链接:51.N 皇后

_n _皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n ,返回所有不同的 _n _皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例:

**输入:** 4
**输出:** [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
**解释:** 4 皇后问题存在两个不同的解法。

提示:

  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

我的题解

#pragma G++ optimize(2)
#pragma GCC optimize(2)

class Solution {
 public:
  vector<vector<string>> ans;
  vector<int> status;
  int n;

  void gao(int s, int main, int counter, int col) {
    if (s == n) {
      vector<string> str(n, string(n, '.'));
      for (int i = 0; i < n; ++i) str[i][status[i]] = 'Q';
      ans.emplace_back(str);
      return;
    }

    int a = ~(col | (main >> 1) | (counter << 1));
    a &= (1 << n) - 1;
    for (int p = 1, i = 0; p < (1 << n); p <<= 1, i++) {
      if (p & a) {
        status.emplace_back(i);
        gao(s + 1, (main >> 1) | p, (counter << 1) | p, col | p);
        status.pop_back();
      }
    }
  }

  vector<vector<string>> solveNQueens(int _n) {
    n = _n;
    ans.clear();
    gao(0, 0, 0, 0);
    return ans;
  }
};
posted @ 2020-09-04 10:15  菁芜  阅读(112)  评论(0编辑  收藏  举报