补全全局数组版排列
补全 dfs_g 的循环体:进入时标记并写进 path_g,返回时成对撤销。输出 1 到 4 的全排列个数。 (本题用 g++ -std=c++17 -O0 编译。)
全局数组版组合
补全 dfs_c:用全局数组从 1 到 5 里取 3 个,每层只从上一个选过的后面挑。输出组合个数。 (本题用 g++ -std=c++17 -O0 编译。)
next_permutation 数排列
补全:把 a 排好序后,用 next_permutation 数出 1、2、3、4 一共有几种排列,并输出第 10 个排列(从 1 数),格式如 24/1234。 (本题用 g++ -std=c++17 -O0 编译。)
按值传就不用撤销
补全 val_dfs:path 按值传,每层拿到的是自己的副本,所以递归回来不用 pop。输出 1、2、3 的全排列个数。 (本题用 g++ -std=c++17 -O0 编译。)
找出漏掉的恢复现场
下面的全局数组版返回时忘了把 used_g[x] 改回去,只数出 1 个排列。修好它,输出 1 到 4 的全排列个数。 (本题用 g++ -std=c++17 -O0 编译。)
剪枝是什么
第 1 步:第一位放 1 或 2 第 2 步:第二位的四种接法 第 3 步:挨着的是连号:当场剪掉 第 4 步:只有这一枝继续往下走 空 1 2 1,2 1,3 2,1 2,3 回溯里的剪枝是指【0】。
剪枝会不会改变答案
剪枝对最终结果的影响是【0】。
什么时候可以剪(C++)
可以剪掉一条分支的条件是【0】。
不剪枝要走多少个结点
把 1 到 5 排成一排,要求挨着的两个不能是连号。这个版本先把 5 个位置全排满,最后才检查。运行它,看走过了多少个结点: #include <cstdlib> #include <iostream> #inclu
剪枝之后呢
同一个问题,这个版本放的时候就检查是不是连号,是就不往下走。运行它: #include <cstdlib> #include <iostream> #include <string> #include &