其他分享
首页 > 其他分享> > 7.2.3 解答树

7.2.3 解答树

作者:互联网

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同时可以适用于可重集的排列
枚举所有排列的另一个方法就是从字典序最小排列开始,不停调用求下一个排列的过程

标签:结点,int,next,7.2,枚举,permutation,解答
来源: https://www.cnblogs.com/FlnButFly/p/15856980.html