枚举排列问题
来源:互联网 发布:程序员 流程图 编辑:程序博客网 时间:2024/05/16 15:42
输入一个整数n,按字典序从大到小的顺序输出前n个数的所有排序。以下列出常用的两种方法。
递归枚举法:
#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
1 0
- 枚举排列问题
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列问题:生成1-n的排列和可重集排列问题
- 关于排列枚举算法
- 递归枚举全排列
- 什么是ERP?
- Leetcode 260. Single Number III
- C语言for循环、while循环(含math.h)
- SpringMVC xml的配置写法
- Ubuntu服务器之间进行Sersync+Rsync同步
- 枚举排列问题
- uploadify 上传 500错误
- Win10系统下软件UI显示不完整解决方案
- Linux内核与根文件系统的关系
- Kodi ——6 Controls (4) Image Control
- Catalan number
- 必须知道的20个正则表达式
- Apache HTTP Server 与 Tomcat 的三种连接方式介绍
- KLite V2正式发布