N-Queens Problem
Problem Statement
Place N queens on an NĆN chessboard such that no two queens attack each other. Return all possible board arrangements.
Example: Input: N = 4 ā Output: [[".Q..","...Q","Q...","..Q."], ["..Q.","Q...","...Q",".Q.."]]
Approach 1: Backtracking
Explanation: Place queens row by row, check safe positions, backtrack if stuck.
Time Complexity: O(N!)
Space Complexity: O(N²) (board storage)
function solve(row):
if row == N:
add board copy to result
return
for col in 0..N-1:
if position (row,col) is safe:
place queen
solve(row+1)
remove queen
solve(0)
š” Think: Place queens row by row, backtracking when a conflict occurs.
Approach 2: Using Hash Sets for Safety
Explanation: Track occupied columns and diagonals using sets for faster checks.
Time Complexity: O(N!)
Space Complexity: O(N) (sets + recursion stack)
cols, diag1, diag2 = sets
function solve(row):
if row == N:
add board copy to result
return
for col in 0..N-1:
if col not in cols and (row+col) not in diag1 and (row-col) not in diag2:
place queen
add col, row+col, row-col
solve(row+1)
remove queen and sets
solve(0)
š” Think: Use sets to track occupied columns and diagonals for fast safety checks.
Approach 3: Bitmask Optimization
Explanation: Use bitmasks to track columns and diagonals for N ⤠32 efficiently.
Time Complexity: O(N!)
Space Complexity: O(N) (recursion stack)
function solve(row, cols, diag1, diag2):
if row == N:
add solution
return
available = ~(cols | diag1 | diag2) & ((1<>1)
solve(0,0,0,0)
š” Think: Represent columns and diagonals with bitmasks for optimized computation.