题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
class Solution {
vector<int> col, dg, udg;
int n;
public:
/**
*
* @param n int整型 the n
* @return int整型
*/
int Nqueen(int _n) {
// write code here
n = _n;
col = vector<int>(n);
dg = udg = vector<int>(2 * n);
return dfs(0);
}
int dfs(int x) {
if (x == n) return 1;
else {
int res = 0;
for (int y = 0; y < n; y++) {
if (!col[y] && !dg[y - x + n] && !udg[y + x]) {
col[y] = dg[y - x + n] = udg[y + x] = true;
res += dfs(x + 1);
col[y] = dg[y - x + n] = udg[y + x] = false;
}
}
return res;
}
}
};
- 思路:递归+三个状态数组
- 使用列、正对角线和负对角线三个数组来维护哪些位置不能放皇后
- 正对角线:y = x + k -> k = y - x 有可能小于0,需要加上n使其变为正数
- 1、遍历每一行
- 2、枚举将皇后放在每一列的位置
- 3、如果当前位置的三个数组值都是false,则继续遍历下一行,直到遍历至末尾
- 时间复杂度:O(n!)
- 空间复杂度:O(n)

