The recursion
void solve(int row, int[] queens, List> result) {
if (row == n) { result.add(build(queens)); return; }
for (int col = 0; col < n; col++) {
if (isValid(queens, row, col)) {
queens[row] = col;
solve(row + 1, queens, result);
// No explicit undo — next iteration overwrites
}
}
}
boolean isValid(int[] queens, int row, int col) {
for (int r = 0; r < row; r++) {
int c = queens[r];
if (c == col || Math.abs(r - row) == Math.abs(c - col)) return false;
}
return true;
}
Advertisement
Pruning with bitmasks
Track columns, main diagonals, anti-diagonals as bitmasks. Constant-time conflict check. Faster.
Advertisement
The recursion
void solve(int row, int[] queens, List> result) {
if (row == n) { result.add(build(queens)); return; }
for (int col = 0; col < n; col++) {
if (isValid(queens, row, col)) {
queens[row] = col;
solve(row + 1, queens, result);
// No explicit undo — next iteration overwrites
}
}
}
boolean isValid(int[] queens, int row, int col) {
for (int r = 0; r < row; r++) {
int c = queens[r];
if (c == col || Math.abs(r - row) == Math.abs(c - col)) return false;
}
return true;
}
Pruning with bitmasks
Track columns, main diagonals, anti-diagonals as bitmasks. Constant-time conflict check. Faster.
Complexity
O(N!) worst case. Pruning helps enormously — N=15 solvable in milliseconds.
Symmetry reduction
Fix first queen in left half of first row. Multiply solutions found by symmetry. Halves time.