- When to use
- Enumerate / search a combinatorial space (subsets, permutations, combinations, n-queens, sudoku, word search). Recurse, mutate, recurse, undo.
- Template
def backtrack(state, choices):
if is_solution(state):
record(state)
return
for choice in choices:
if not feasible(state, choice): continue
apply(state, choice)
backtrack(state, remaining(choices, choice))
undo(state, choice)- Complexity
- Exponential in the worst case (subsets O(2^n), permutations O(n!)). Pruning is the difference between accepted and TLE.
- Examples
- Subsets / Subsets II
- Permutations / Permutations II
- Combination Sum
- N-Queens
- Word Search
- Sudoku Solver