枚举排列问题
2016-06-14 11:37
190 查看
输入一个整数n,按字典序从大到小的顺序输出前n个数的所有排序。以下列出常用的两种方法。
递归枚举法:
使用STL中的next_permutation法:
结果:
注:
练习题:
HDU 1027
递归枚举法:
#include<iostream> using namespace std; void printf_permutation(int n,int *A,int cur){ if(cur==n){ for(int i=0;i<n;i++)cout<<A[i]; cout<<endl; } else for(int i=1;i<=n;i++){ int ok=1; for(int j=0;j<cur;j++) if(A[j]==i)ok=0; if(ok){ A[cur]=i; printf_permutation(n,A,cur+1); } } } int main(){ int n; int A[1000]; cin>>n; printf_permutation(n,A,0); }
使用STL中的next_permutation法:
#include<iostream> #include<algorithm> using namespace std; int main(){ int n,A[1000]; cin>>n; for(int i=0;i<n;i++)A[i]=i+1; do{ for(int i=0;i<n;i++)cout<<A[i]; cout<<endl; } while(next_permutation(A,A+n)); return 0; }
结果:
注:
C++提供的STL中提供库函数next_permutation。他的基本原理是重新排列范围内的元素[first,last)返回按照字典序排列的下一个值较大的组合。 返回值:如果有一个更高的排列,它重新排列元素,并返回true;如果这是不可能的(因为它已经在最大可能的排列),它按升序排列重新元素,并返回false。 注意如果不是从最小的字典序开始,那么之前应该sort(a,a+n).
练习题:
HDU 1027
相关文章推荐
- SpringMVC xml的配置写法
- Android与JS互相调用
- C语言for循环、while循环(含math.h)
- iOS 圆角那些事
- DjangoUnicodeDecodeError <TableTest>
- Leetcode 260. Single Number III
- 什么是ERP?
- android快速索引的实现
- apache反向代理
- logrotate日志管理工具
- Oracle:导入导出
- 实现二级域名
- 实现二级域名
- apache反向代理
- 正则小结
- 传递指针和指针的引用的差别
- 基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析
- 在web.xml中配置SpringMVC的启动配置项
- 【2】搭建HA高可用hadoop-2.3(安装zookeeper)
- C语言基本类型