- 51.N皇后
- 思路:
在一个nn的方针上放n个皇后棋子,保证每个皇后独占一行,一列,两条斜线,因此需要isValid这个判断函数;
放置皇后时,从第0行逐行往下找,这对应树的深度;对于每一行有n列,遍历每一列,并尝试在每一个位置放置皇后,横向遍历对应树的宽度;
终止条件:成功走到第n行;
循环:对当前curRow行的每一列都尝试,且仅有该位置有效时才递归去寻找下一层;
棋盘初始为nn的’.’,方便放皇后时的操作;
class Solution {
private:
vector<vector<string>> result;
bool isValid(vector<string>& chessboard, int row, int col, int n) {
for (int i = 0; i < row; ++i) {
if (chessboard[i][col] == 'Q') return false;
}
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j) {
if (chessboard[i][j] == 'Q') return false;
}
for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j) {
if (chessboard[i][j] == 'Q') return false;
}
return true;
}
void backtracking(vector<string>& chessboard, int curRow, int n) {
if (curRow == n) {
result.push_back(chessboard);
return;
}
for (int i = 0; i < n; ++i) {
if (isValid(chessboard, curRow, i, n)) {
chessboard[curRow][i] = 'Q';
backtracking(chessboard, curRow + 1, n);
chessboard[curRow][i] = '.';
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector<string> chessboard(n, string(n, '.'));
backtracking(chessboard, 0, n);
return result;
}
};