What is the Backtracking Technique?
Backtracking is a recursive technique for solving problems incrementally, one piece at a time, and removing those solutions that fail to satisfy the problem's constraints as soon as possible. It is often used for constraint satisfaction problems like N-Queens, Sudoku Solver, Subset Sum, and Permutation Generation.
The basic idea is to build a solution step-by-step and go back ("backtrack") as soon as we determine that the current path cannot lead to a valid solution. It is essentially a depth-first search with pruning.
Key Characteristics of Backtracking
- Solves problems by exploring all potential candidates.
- Abandons a path as soon as it is determined to be invalid (pruning).
- Usually implemented recursively using DFS-style exploration.
General Backtracking Pseudocode
// Function to try all possible options
function backtrack(state):
if isSolution(state):
output(state)
return
for option in getOptions(state):
if isValid(option, state):
applyOption(state, option)
backtrack(state)
undoOption(state, option)
Explanation of Steps
- isSolution(state) — Check if the current state is a complete/valid solution.
- getOptions(state) — Generate all possible choices/options from the current state.
- isValid(option, state) — Check if the option is valid in the current state.
- applyOption(state, option) — Make the move (update state).
- undoOption(state, option) — Undo the move (backtrack to previous state).
Where is Backtracking Used?
- N-Queens Problem
- Sudoku Solver
- Generate All Subsets / Permutations
- Word Search in Grid
- Maze Path Finding
- Graph Coloring
Backtracking is powerful for problems with complex constraints and multiple solution paths. It’s particularly effective when combined with pruning techniques to skip unnecessary branches in the solution space.