N-Queens Problem
Problem Statement
Place n queens on an n×n chessboard such that no two queens threaten each other (no shared row, column, or diagonal). Return all distinct solutions as board configurations. This hard-level problem uses backtracking to try every placement—picture a royal puzzle where queens must coexist peacefully!
Example
Input: n = 4
Output: [[".Q..","...Q","Q...","..Q."], ["..Q.","Q...","...Q",".Q.."]] (two valid 4×4 layouts)
Input: n = 1
Output: [["Q"]] (one queen on a 1×1 board)
Code
Java
Python
JavaScript
public class Solution { public List> solveNQueens(int n) { List
> result = new ArrayList<>(); char[][] board = new char[n][n]; for (char[] row : board) Arrays.fill(row, '.'); backtrack(result, board, 0, n); return result; } private void backtrack(List
> result, char[][] board, int row, int n) { if (row == n) { result.add(buildBoard(board)); return; } for (int col = 0; col < n; col++) { if (isSafe(board, row, col, n)) { board[row][col] = 'Q'; backtrack(result, board, row + 1, n); board[row][col] = '.'; // Backtrack } } } private boolean isSafe(char[][] board, int row, int col, int n) { for (int i = 0; i < row; i++) if (board[i][col] == 'Q') return false; for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) if (board[i][j] == 'Q') return false; for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) if (board[i][j] == 'Q') return false; return true; } private List
buildBoard(char[][] board) { List layout = new ArrayList<>(); for (char[] row : board) layout.add(new String(row)); return layout; } }
def solve_n_queens(n): def backtrack(row): if row == n: result.append(["".join(r) for r in board]) return for col in range(n): if is_safe(row, col): board[row][col] = "Q" backtrack(row + 1) board[row][col] = "." # Backtrack def is_safe(row, col): for i in range(row): if board[i][col] == "Q": return False for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)): if board[i][j] == "Q": return False for i, j in zip(range(row-1, -1, -1), range(col+1, n)): if board[i][j] == "Q": return False return True board = [["."] * n for _ in range(n)] result = [] backtrack(0) return result # Example usage print(solve_n_queens(4)) # [[".Q..","...Q","Q...","..Q."], ["..Q.","Q...","...Q",".Q.."]] print(solve_n_queens(1)) # [["Q"]]
function solveNQueens(n) { function backtrack(row) { if (row === n) { result.push(board.map(row => row.join(""))); return; } for (let col = 0; col < n; col++) { if (isSafe(row, col)) { board[row][col] = "Q"; backtrack(row + 1); board[row][col] = "."; // Backtrack } } } function isSafe(row, col) { for (let i = 0; i < row; i++) if (board[i][col] === "Q") return false; for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) if (board[i][j] === "Q") return false; for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) if (board[i][j] === "Q") return false; return true; } let board = Array(n).fill().map(() => Array(n).fill(".")); let result = []; backtrack(0); return result; } // Example usage console.log(solveNQueens(4)); // [[".Q..","...Q","Q...","..Q."], ["..Q.","Q...","...Q",".Q.."]] console.log(solveNQueens(1)); // [["Q"]]
Explanation
- Base Case: When row equals n, a solution is complete—add the board layout.
- Backtracking: Place a queen in each column of the current row if safe, then recurse.
- Safety Check: Verify no conflicts in column, left diagonal, or right diagonal above.
- Flow Example (n=2): No solution (2×2 can’t fit 2 queens); n=4 yields complex patterns.
- Construction: Build strings from the board for each valid configuration.
Note
Time complexity is O(n!) due to trying all permutations with pruning. Space complexity is O(n²) for the board plus O(n) for the stack. It’s a regal challenge of strategy!