题目描述
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
样例
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
算法1
(DFS暴力枚举) $O(n!)$
遍历每一行,并记录哪些列、哪些对角线已经被占据;
能填完nn行的,就更新一下答案。
时间复杂度
只考虑列的互相约束,时间复杂度上界为n!n!,实际运算还会考虑对角线约束,复杂度会更低。
参考文献
C++ 代码
class Solution {
private:
int res = 0;
vector<int> col, diag_s, diag_m;
public:
int totalNQueens(int n) {
if (n <= 0) return 0;
col = vector<int>(n);
diag_s = vector<int>(2 * n - 1);
diag_m = vector<int>(2 * n - 1);
dfs(0, n);
return res;
}
void dfs(int r, const int &n){
if (r >= n){
++res;
return;
}
for (int c = 0; c < n; ++c){
if (!col[c] && !diag_s[r + c] && !diag_m[r - c + n - 1]){
col[c] = diag_s[r + c] = diag_m[r - c + n - 1] = true;
dfs(r + 1, n);
col[c] = diag_s[r + c] = diag_m[r - c + n - 1] = false;
}
}
}
};