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.