Backtracking construye soluciones candidatas incrementalmente y abandona (retrocede de) un candidato parcial tan pronto como no puede llevar a una solución válida. Explora sistemáticamente el espacio de soluciones mediante DFS, podando callejones sin salida.
La idea
Elige -> explora -> deshace la elección. Prueba una opción, recurre; si falla, deshaz y prueba la siguiente.
Ejemplo: todas las permutaciones
():
result = []
():
remaining:
result.append(path[:])
i ((remaining)):
path.append(remaining[i])
backtrack(path, remaining[:i] + remaining[i+:])
path.pop()
backtrack([], nums)
result
permutations([, , ])
