Row-by-row backtracking with attack sets
Time O(n!) roughly Space O(n)dfs(row): for each column c not in cols, diag (r − c) or anti (r + c), place, recurse on row + 1, remove. Record when row == n.
import java.util.*;
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> out = new ArrayList<>();
int[] queenCol = new int[n];
dfs(0, n, queenCol, new boolean[n], new boolean[2 * n], new boolean[2 * n], out);
return out;
}
private void dfs(int r, int n, int[] q, boolean[] cols, boolean[] diag, boolean[] anti, List<List<String>> out) {
if (r == n) {
List<String> board = new ArrayList<>();
for (int i = 0; i < n; i++) {
char[] row = new char[n];
Arrays.fill(row, '.');
row[q[i]] = 'Q';
board.add(new String(row));
}
out.add(board);
return;
}
for (int c = 0; c < n; c++) {
if (cols[c] || diag[r - c + n] || anti[r + c]) continue;
q[r] = c;
cols[c] = diag[r - c + n] = anti[r + c] = true;
dfs(r + 1, n, q, cols, diag, anti, out);
cols[c] = diag[r - c + n] = anti[r + c] = false;
}
}
}Verdict: Pruning cuts the search to a few thousand nodes for n = 8.