7.2.3 解答树
这棵树的第0层有n个子节点,第1层有(n-1)个子结点,第二层有(n-2)个子节点,...,第n层就没有子节点了,即第n层的结点都是叶子结点,总共有n!个结点
由于这棵树是从无到有逐渐生成完整解的过程,因此将其称为解答树
如果某问题的解可以由多个步骤得到,而每个步骤都有若干种选择(这些候选方案集可能会依赖与先前做出的选择),且可以用递归枚举方法实现,则它的工作方式可以用解答树描述
注意对于上述的解答树的节点个数主要是和最后两层的结点数n!有关,即大多数情况下解答树上的结点几乎全部来源于最后一两层
7.2.4 下一个排列
点击查看代码
#include<cstdio>
#include<algorithm>//include next_permutation
using namespace std;
int main() {
int n, p[10];
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &p[i]);
sort(p, p+n);
do {
for(int i = 0; i < n; i++) printf("%d ", p[i]);
printf("\n");
} while(next_permutation(p, p+n));
return 0;
}
枚举排列的常见方法有两种:一是递归枚举,二是用STL中的next_permutation
next_permutation的返回值是bool类型的,同时true的含义是可以返回一个比之前的序列尽可能小的一个序列,然后如果不可以返回比之前的序列还要小的序列返回值就是false
这个函数可以减轻手写全排的麻烦,注意next_permutation同时可以适用于可重集的排列
枚举所有排列的另一个方法就是从字典序最小排列开始,不停调用求下一个排列的过程