Article start
DSA Course: Interview Patterns and Problem Solving
Module 11: Recursion & Backtracking

N-Queens: Constraint Backtracking Pattern

Place queens row by row while tracking blocked columns and diagonals.

May 29, 2026·26

Learning Outcome

After this lesson, you should be able to encode board constraints with column and diagonal sets.

Problem Statement

Given n, return all distinct ways to place n queens on an n x n board so no two queens attack each other.

InputOutputWhy
n = 4two valid boardsFor n = 4 there are exactly two valid queen placements.

Brute Force Approach

Try placements and scan the whole board each time to check safety. This repeats expensive checks.

Optimized Approach

Place one queen per row and track used columns, row-col diagonals, and row+col diagonals in sets.

Exact Pseudocode

dfs(row):
  if row == n:
    answer.add(copy(board))
    return
  for col from 0 to n - 1:
    if col or diagonals are blocked:
      continue
    place queen
    mark col and diagonals
    dfs(row + 1)
    remove queen and marks
dfs(0)

Reference Code

class Solution:
    def solveNQueens(self, n):
        answer = []
        board = [["."] * n for _ in range(n)]
        cols, diag1, diag2 = set(), set(), set()

        def dfs(row):
            if row == n:
                answer.append(["".join(r) for r in board])
                return

            for col in range(n):
                if col in cols or row - col in diag1 or row + col in diag2:
                    continue

                cols.add(col)
                diag1.add(row - col)
                diag2.add(row + col)
                board[row][col] = "Q"
                dfs(row + 1)
                board[row][col] = "."
                cols.remove(col)
                diag1.remove(row - col)
                diag2.remove(row + col)

        dfs(0)
        return answer

Sample Dry Run

StepStateResult
Row 0Try a column and mark diagonalsMove to row 1
Row 1Blocked columns and diagonals are skippedOnly safe cells are tried
Dead endNo safe column existsBacktrack and remove marks
row == nAll rows placedCopy one board

Complexity

MeasureValueReason
TimeO(n!)Backtracking prunes many placements, but the search is still factorial scale.
SpaceO(n^2)The board uses n^2 space and the sets use O(n).

Edge Cases

  • n = 1 has one solution.
  • n = 2 and n = 3 have no solutions.
  • Diagonal keys are row - col and row + col.

Interview Checklist

  • Place exactly one queen per row.
  • Use sets for O(1) conflict checks.
  • Remove all marks during backtracking.

FAQs

Why one queen per row?

Every valid board needs exactly one queen in each row, so row-by-row search reduces choices.

Why row - col and row + col?

Cells on the same diagonals share these values.

What is the core pattern?

Constraint backtracking.

Test your knowledge

Take a quick quiz based on this chapter.

Discussion

0 comments

Sign in to share a question or add to the discussion.
Start the discussion

Ask a question or share what stood out to you.