CHOOSE · CONSTRAINT · BACKTRACK
在当前状态做一次决策(选哪个元素、放哪一列等),进入新状态。
检查是否满足条件;不满足则剪枝,不再往下搜。
递归返回时撤销本次选择,恢复状态,尝试其他分支。
生成数组的所有排列。每次从未使用元素中选一个加入当前路径,递归;返回时回溯(撤销选择),再试下一个。
permute(path, remaining):
if remaining 为空: 输出 path,return
for each x in remaining:
将 x 加入 path,从 remaining 移除
permute(path, remaining)
回溯:path 弹出,x 放回 remaining