题目:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
思路:
暴力回溯求解即可
代码:
class Solution {
public:
vector<vector<string>> ans;
vector<string> cur;
bool isOK(int row, int col, int n) {
if (row >= 0 && row < n && col >= 0 && col < n) return true;
return false;
}
bool isSameCol(int row, int col) {
for (int i = row - 1; i >= 0; i--) {
if (cur[i][col] == 'Q') return true;
}
return false;
}
bool isdiagonal(int row, int col, int n) {
int rR = row - 1, rL = row - 1, colR = col + 1, colL = col - 1;
while (isOK(rR, colR, n)) {
if (cur[rR][colR] == 'Q') return true;
rR--;colR++;
}
while (isOK(rL, colL, n)) {
if (cur[rL][colL] == 'Q') return true;
rL--;colL--;
}
return false;
}
void backTrack(int n, int r) {
if (r == n) {
ans.push_back(cur);
return;
}
for (int i = 0; i < n; i++) {
if (isSameCol(r, i) || isdiagonal(r, i, n)) continue;
cur[r][i] = 'Q';
backTrack(n, r + 1);
cur[r][i] = '.';
}
}
vector<vector<string>> solveNQueens(int n) {
string init = "";
for (int i = 0; i < n; i++) {
init += ".";
}
cur.resize(n, init);
backTrack(n, 0);
return ans;
}
};