N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围:
要求:空间复杂度
,时间复杂度
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:
bool isLegal(int n, int* POS, int k) { //判断第k行是否合法
for (int row = 0; row < k; row++)
if (POS[k] == POS[row] || POS[k] == POS[row] - (row - k) || POS[k] == POS[row] + (row - k))
return false;
return true;
}
int TotalCase(int n, int* POS, int k) { //返回0~k-1行给定时的可能数
if (k == n)
return 1;
int ans = 0;
for (int i = 0; i < n; i++) {
POS[k] = i;
if (isLegal(n, POS, k))
ans += TotalCase(n, POS, k + 1);
}
return ans;
}
int Nqueen(int n ) {
int POS[n]; // POS[k]表示第k行的皇后所在列数
return TotalCase(n, POS, 0);
} int available(int n, int x, int y, int cols, int diag1, int diag2) {
return !(cols & 1 << x || diag1 & 1 << (x + y) || diag2 & 1 << (n - 1 + x - y));
}
void dfs(int n, int y, int cols, int diag1, int diag2, int* ans) {
if (y > n) {
++(*ans);
return;
}
for (int x = 1; x <= n; ++x) {
if (!available(n, x, y, cols, diag1, diag2)) continue;
cols |= 1 << x;
diag1 |= 1 << (x + y);
diag2 |= 1 << (n - 1 + x - y);
dfs(n, y + 1, cols, diag1, diag2, ans);
cols -= 1 << x;
diag1 -= 1 << (x + y);
diag2 -= 1 << (n - 1 + x - y);
}
}
int Nqueen(int n) {
int ans = 0, cols = 0, diag1 = 0, diag2 = 0;
dfs(n, 1, cols, diag1, diag2, &ans);
return ans;
}