N 皇後問題變體:只需返回不同解的總數,不輸出具體棋盤佈局。
逐行放置皇後,維護三個攻擊狀態集合:
cols:已佔用列diag1:主對角線 (row - col 恆定)diag2:副對角線 (row + col 恆定)位掩碼優化(N ≤ 14 適合用 int):
columns、diagonals1、diagonals2 為整數掩碼(~(columns | diagonals1 | diagonals2)) & ((1<p = available & -available 依嘗試
#include
#include
using namespace std;
class Solution {
int count = 0;
void backtrack(int row, int n, vector& cols, vector& diag1, vector& diag2) {
if (row == n) { count++; return; }
for (int col = 0; col < n; col++) {
int d1 = row - col + n - 1; // 主對角線索引 0~2n-2
int d2 = row + col; // 副對角線索引 0~2n-2
if (!cols[col] && !diag1[d1] && !diag2[d2]) {
cols[col] = diag1[d1] = diag2[d2] = true;
backtrack(row + 1, n, cols, diag1, diag2);
cols[col] = diag1[d1] = diag2[d2] = false;
}
}
}
public:
int totalNQueens(int n) {
vector cols(n), diag1(2*n-1), diag2(2*n-1);
backtrack(0, n, cols, diag1, diag2);
return count;
}
};
class Solution {
int count = 0, n;
void dfs(int row, int cols, int diag1, int diag2) {
if (row == n) { count++; return; }
int available = (~(cols | diag1 | diag2)) & ((1<>1);
}
}
public:
int totalNQueens(int n) {
this->n = n;
dfs(0, 0, 0, 0);
return count;
}
};
row-col 範圍 [-(n-1), n-1],加 n-1 偏移為 [0, 2n-2]