Backtracking

Learn backtracking to solve constraint satisfaction problems like generating subsets, permutations, and solving puzzles like N-Queens.

By TechCoder TeamLast updated: 2026-10-17
In a Nutshell

Learn backtracking to solve constraint satisfaction problems like generating subsets, permutations, and solving puzzles like N-Queens. This hands-on tutorial focuses on practical implementation of backtracking concepts.

Backtracking

Backtracking is an algorithmic technique for solving problems by trying to build a solution incrementally and abandoning ("backtracking" from) solutions that fail to satisfy constraints.

What is Backtracking?

Backtracking systematically explores all possible solutions by:

  1. Making a choice
  2. Exploring consequences
  3. Undoing the choice if it leads to invalid solution (backtrack)
  4. Trying the next option

Think of it as exploring a maze: try a path, if it's a dead end, go back and try another path.

Generate All Subsets

Generate all possible subsets of a set.

def generate_subsets(nums):
    result = []
    
    def backtrack(start, current):
        # Add current subset
        result.append(current[:])
        
        # Try adding each remaining element
        for i in range(start, len(nums)):
            current.append(nums[i])      # Make choice
            backtrack(i + 1, current)    # Explore
            current.pop()                 # Undo choice (backtrack)
    
    backtrack(0, [])
    return result
PYTHON PLAYGROUND
⏳ Loading editor…

Generate All Permutations

Generate all possible arrangements of elements.

def generate_permutations(nums):
    result = []
    
    def backtrack(current):
        # Base case: complete permutation
        if len(current) == len(nums):
            result.append(current[:])
            return
        
        # Try each unused number
        for num in nums:
            if num in current:
                continue  # Already used
            
            current.append(num)        # Make choice
            backtrack(current)         # Explore
            current.pop()              # Backtrack
    
    backtrack([])
    return result
PYTHON PLAYGROUND
⏳ Loading editor…

Combination Sum

Find all combinations that sum to a target.

def combination_sum(candidates, target):
    result = []
    
    def backtrack(start, current, remaining):
        # Base case: found valid combination
        if remaining == 0:
            result.append(current[:])
            return
        
        # Base case: exceeded target
        if remaining < 0:
            return
        
        # Try each candidate
        for i in range(start, len(candidates)):
            current.append(candidates[i])
            # Can reuse same element, so pass i not i+1
            backtrack(i, current, remaining - candidates[i])
            current.pop()
    
    backtrack(0, [], target)
    return result
PYTHON PLAYGROUND
⏳ Loading editor…

N-Queens Problem

Place N queens on an N×N chessboard so no two queens attack each other.

def solve_n_queens(n):
    result = []
    board = [['.'] * n for _ in range(n)]
    
    def is_safe(row, col):
        # Check column
        for i in range(row):
            if board[i][col] == 'Q':
                return False
        
        # Check diagonal (top-left)
        i, j = row - 1, col - 1
        while i >= 0 and j >= 0:
            if board[i][j] == 'Q':
                return False
            i -= 1
            j -= 1
        
        # Check diagonal (top-right)
        i, j = row - 1, col + 1
        while i >= 0 and j < n:
            if board[i][j] == 'Q':
                return False
            i -= 1
            j += 1
        
        return True
    
    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'  # Place queen
                backtrack(row + 1)
                board[row][col] = '.'  # Backtrack
    
    backtrack(0)
    return result
PYTHON PLAYGROUND
⏳ Loading editor…

Sudoku Solver

def solve_sudoku(board):
    def is_valid(row, col, num):
        # Check row
        if str(num) in board[row]:
            return False
        
        # Check column
        if str(num) in [board[i][col] for i in range(9)]:
            return False
        
        # Check 3x3 box
        box_row, box_col = 3 * (row // 3), 3 * (col // 3)
        for i in range(box_row, box_row + 3):
            for j in range(box_col, box_col + 3):
                if board[i][j] == str(num):
                    return False
        
        return True
    
    def backtrack():
        for row in range(9):
            for col in range(9):
                if board[row][col] == '.':
                    for num in range(1, 10):
                        if is_valid(row, col, num):
                            board[row][col] = str(num)
                            
                            if backtrack():
                                return True
                            
                            board[row][col] = '.'  # Backtrack
                    
                    return False  # No valid number found
        return True  # Board is complete
    
    backtrack()
    return board
PYTHON PLAYGROUND
⏳ Loading editor…

AI Mentor

Assistant

Confused about "backtracking subsets permutations combinations N-queens constraint satisfaction"? Ask our AI mentor for a simplified explanation.

Quiz

Quiz

Question 1 of 5

What is the key step in backtracking?

Always move forward
Undo choices that don't work
Try every possibility at once
Use dynamic programming

Key Takeaways

✅ Backtracking explores solutions by making and undoing choices
✅ Subsets of n elements: 2^n total (include/exclude each)
✅ Permutations of n elements: n! arrangements
✅ N-Queens classic backtracking problem with constraints
✅ Pattern: Make choice → Explore → Backtrack if invalid

Master backtracking for constraint satisfaction and search problems! 🚀