思路
建立决策树,每个节点的属性:
- 路径
- 选择列表
遍历决策树的每一个节点即可。每个节点的选择:在该行的任意一列放置一个皇后。
class Solution {
private:
vector<vector<string>> allPath;
public:
void backTrack(vector<string>& path, int row) {
if (path.size() == row) {
allPath.push_back(path);
return ;
}
for (int i = 0; i < path.size(); i ++) {
if (!isVaild(row, i, path)) continue;
path[row][i] = 'Q';
backTrack(path, row + 1);
path[row][i] = '.';
}
}
bool isVaild(int row, int col, vector<string>& path) {
for (int i = row - 1; i >= 0; i --) { //观察同一列
if (path[i][col] == 'Q') return false;
}
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i --, j --) { //观察左上
if (path[i][j] == 'Q') return false;
}
for (int i = row - 1, j = col + 1; i >= 0 && j < path.size(); i --, j ++) { //观察右上
if (path[i][j] == 'Q') return false;
}
return true;
}
vector<vector<string>> solveNQueens(int n) {
vector<string> path(n, string(n, '.'));
backTrack(path, 0);
return allPath;
}
};