N 皇后
题目描述
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

解题思路
分层去处理,每次从一层中取出一个位置放皇后,验证是否合法,直到所有行全部放了皇后。
解法分为两个主要部分:
- 验证在棋盘某一个位置放下皇后,是否满足条件:
- 在每一行遍历该层所有位置,只要合法就继续往下尝试,直到最后一行也放了皇后。
题解
class Solution {
public:
vector<vector<string>> ans;
bool isLegal(vector<string>& chessBoard, int i, int j, int n) {
for (int p1 = i - 1; p1 >= 0; p1--) {
if (chessBoard[p1][j] == 'Q') {
return false;
}
}
for (int p1 = i - 1, p2 = j - 1; p1 >= 0 && p2 >= 0; p1--, p2--) {
if (chessBoard[p1][p2] == 'Q') {
return false;
}
}
for (int p1 = i - 1, p2 = j + 1; p1 >= 0 && p2 < n; p1--, p2++) {
if (chessBoard[p1][p2] == 'Q') {
return false;
}
}
return true;
}
void BackTreack(vector<string>& chessBoard, int n, int i) {
if (i == n) {
ans.push_back(chessBoard);
return;
}
for (int j = 0; j < n; j++) {
if (isLegal(chessBoard, i, j, n)) {
chessBoard[i][j] = 'Q';
BackTreack(chessBoard, n, i + 1);
chessBoard[i][j] = '.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
ans.clear();
vector<string> chessBoard(n, string(n, '.'));
BackTreack(chessBoard, n, 0);
return ans;
}
};
总结
其实这里都是回溯的标准模板,花了一些时间,还是可以做出来的。这道题目和数独很像,但是哪一题我用同样的思路会超时,我可能需要继续思考一下数独应该怎么解决。

被折叠的 条评论
为什么被折叠?



