交付回溯加剪枝验收
这是这条路线的最终作品。模板里已经有全部函数的框架和验收用的 main,补全几个关键的递归函数,一次验完五条:1、2、3 全排列 6 个、子集 8 个;第一个排列是 1,2,3;漏了 pop_back 的版本只有 1 个解;剪枝前后解数相同
限时题靠什么过
N 皇后 n = 12 时不剪枝根本跑不完,能在限时内跑完的关键是【0】。
写组合枚举
场景:实验机上 ~/work/bt/comb.cpp 读入 n 和 k,要按字典序输出从 1..n 里取 k 个的全部组合,每行一个,数之间一个空格。comb_dfs 还没写。 任务:补全 comb_dfs。make 编译,./comb &
十二皇后要剪枝
场景:~/work/bt/queens.cpp 数 n 皇后的解数:它把每一行的列号全排好,排满之后才检查斜线。n 小的时候对,n = 12 就跑不完。 任务:改写 queens.cpp,放之前就检查列和两条斜线,让 n = 12 在 2
修好忘了撤销的标记
场景:~/work/bt/perm.cpp 读入 n,按字典序输出 1..n 的全部排列。可它只输出了第一个。 任务:找到回溯里漏掉的那一步恢复现场并修好。make 编译后用 sample.txt 自测;check 会用随机的 n 对拍。
修好重复输出的子集
场景:~/work/bt/subsets.cpp 读入一组可能有重复的数,要输出所有不重复的子集。可它输出了好几个一模一样的子集。 任务:修好去重的判断,让每个子集只出现一次、顺序不变。make 编译后用 sample.txt 自测;che
写数独的可行性检查
场景:~/work/bt/sudoku.cpp 读入一个 9×9 数独局面(0 表示空格)和若干询问「r c d」,回答数字 d 能不能填进第 r 行第 c 列。can_place 还没写。 任务:补全 can_place:同一行、同一列、
重叠子问题是什么意思
说一个问题有「重叠子问题」,是指【0】。
最优子结构是什么意思
第 1 步:要算 f(4) 第 2 步:拆成 f(3) 和 f(2) 第 3 步:再往下拆一层 第 4 步:拆到最底 第 5 步:f(2) 被算了两遍 第 6 步:f(1) 更是算了三遍 f4 f3 f2 f2 f1 f1 f0 f1 f0
用 DP 要同时满足哪两条
一个问题能用动态规划,要同时具备【0】。