Backtracking constrói soluções candidatas incrementalmente e abandona (retrocede) um candidato parcial assim que ele não puder levar a uma solução válida. Ele explora sistematicamente o espaço de soluções via DFS, podando becos sem saída.
A ideia
Escolha -> explore -> desescolha. Tente uma opção, recursivamente; se falhar, desfaça e tente a próxima.
Exemplo: todas as permutações
():
result = []
():
remaining:
result.append(path[:])
i ((remaining)):
path.append(remaining[i])
backtrack(path, remaining[:i] + remaining[i+:])
path.pop()
backtrack([], nums)
result
permutations([, , ])
