题目:
n 皇后问题 研究的是如何将 n
个皇后放置在 n × n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回 n 皇后问题 不同的解决方案的数量。
示例 1:
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 9
思路:
暴力回溯求解即可
代码:
class Solution {
public:
int 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++;
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] = '.';
}
}
int totalNQueens(int n) {
string init = "";
for (int i = 0; i < n; i++) {
init += ".";
}
cur.resize(n, init);
backTrack(n, 0);
return ans;
}
};