Leetcode 51 N皇后
问题重述
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
思路
经典的回溯算法,因为是n行n列,我们只需要对每一行进行遍历插入皇后即可,可以看最终代码,简单易懂。
最终代码
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ans;
if (n == 0) {
return ans;
}
vector<string> board(n, string(n, '.'));
vector<bool> column(n, false), ldiag(2*n-1, false), rdiag(2*n-1, false);
backtracking(ans, board, column, ldiag, rdiag, 0, n);
return ans;
}
void backtracking(vector<vector<string>>& ans, vector<string>& board, vector<bool>& column, vector<bool>& ldiag,vector<bool>& rdiag, int row, int n) {
if (row == n) {
ans.push_back(board);
return;
}
for (int i = 0; i < n; ++i) {
if (column[i] || ldiag[n-row+i-1] || rdiag[row+i+1]) {
continue;//跳过本次循环,到下一次
}
board[row][i] = 'Q';
column[i] = ldiag[n-row+i-1] = rdiag[row+i+1] = true;
backtracking(ans, board, column, ldiag, rdiag, row+1, n);
board[row][i] = '.';
column[i] = ldiag[n-row+i-1] = rdiag[row+i+1] = false;
}
}
};