交付:回溯 + 剪枝验收

交付:回溯 + 剪枝验收

这是这条路线的最终作品。把前四步的代码合起来,一次验完五条: [1,2,3] 全排列 6 个,[1,2,3] 子集 8 个 第一个排列是 1,2,3(说明存的是副本,不是引用) 漏了 path.pop

阅读更多 →
第四步:N 皇后

第四步:N 皇后

写出 ok 和 queens,把 n = 4、5、6、7 各跑一遍,四个解数拼起来输出。

阅读更多 →
第三步:剪枝,并证明它没剪错

第三步:剪枝,并证明它没剪错

写出 naive 和 pruned(1 到 5 排一排、挨着的不能是连号),输出不剪枝结点数 / 剪枝结点数 / 解数是否一致。

阅读更多 →
第二步:把路径记对

第二步:把路径记对

写出撤销写全、并且存**副本**的 perm,输出解的个数和第一个解。

阅读更多 →
第一步:排列、组合、子集

第一步:排列、组合、子集

最终作品第一步:写出 perm、comb、subs,输出三个个数([1,2,3] 全排列 / [1,2,3,4] 取 2 / [1,2,3] 子集)。

阅读更多 →
四项一起对得上吗

四项一起对得上吗

运行下面这段程序: def perm(a): res = [] path = [] used = [False] * len(a) def dfs():

阅读更多 →
交付一个回溯解要验什么

交付一个回溯解要验什么

把一个带剪枝的回溯解交出去,必须验的是【0】。

阅读更多 →
拿到一个搜索问题,先想清楚什么

拿到一个搜索问题,先想清楚什么

要用回溯解一个新问题,第一件事是想清楚【0】。

阅读更多 →
⚠️ 四个版本的解数摆在一起

⚠️ 四个版本的解数摆在一起

把四个版本都写出来,只输出各自解的个数: 完全正确的版本 res.append(path)(存引用) 漏了 path.pop() 漏了 used[i] = False 四个数用 / 拼起来。

阅读更多 →
⚠️ 两种漏撤销,症状一模一样

⚠️ 两种漏撤销,症状一模一样

写三个版本跑 [1, 2, 3]: 漏了 path.pop() 漏了 used[i] = False 两样都撤销的正确版 把三个解的个数拼起来输出(按上面的顺序)。

阅读更多 →