用过的标记
约 10 分钟
全排列里最关键的一步,是记住哪些数已经被用掉了,否则会把同一个数填两次。用一个 used 数组:选中就置真,回溯时一定要置回假。
used[i] = true; // 选 i,占用
perm[step] = i;
dfs(step + 1);
used[i] = false; // 撤销,让后面别的分支还能选 i
那行 used[i] = false 是新手最容易漏的一句。漏了会怎样?第一个数一旦被某条分支用过,就永远停留在"已用"状态,别的分支再也选不到它,结果只能生成极少数几个排列,其余全被漏掉。记住:标记和撤销必须成对出现,有进就有出。
小纸条
不取消标记会漏掉什么?
登录 后可看答案