52. N皇后 II
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
解题思路: 此题的解法与51题的解法相似,区别仅仅是这次换成了统计解决方案的次数。
// 与昨天题的思路相同,区别仅仅是今天是统计解决方案的个数
// Time & Space: O(n^2)
class Solution {
public:
void dfs(int curRow, int n, vector<string> &out, int &res) {
if (curRow >= n) {
++res;
return;
}
for (int i = 0; i < n; ++i) {
if (isValid(out, n, curRow, i)) {
out[curRow][i] = 'Q';
dfs(curRow + 1, n, out, res);
out[curRow][i] = '.';
}
}
}
int totalNQueens(int n) {
vector<string> out(n, string(n, '.'));
int res = 0;
dfs(0, n, out, res);
return res;
}
bool isValid(vector<string> &out, int n, int curRow, int curCol) {
for (int i = curRow - 1; i >= 0; --i) {
if (out[i][curCol] == 'Q') return false;
}
for (int i = curRow - 1, j = curCol - 1; i >=0 && j >= 0; --i, --j) {
if (out[i][j] == 'Q') return false;
}
for (int i = curRow - 1, j = curCol + 1; i >= 0 && j < n; --i, ++j) {
if (out[i][j] == 'Q') return false;
}
return true;
}
};