全排列总结
来源:互联网 发布:linux 解压缩war包 编辑:程序博客网 时间:2024/05/22 15:14
若给你一堆数,让你输出他的全排列,可以有以下方式实现,不过各有优点和缺点:
1.深度优先搜索:
#include<stdio.h>d#include<string.h>#include<algorithm>#include<math.h>using namespace std;int n;int book[100];int ch[100];int kong[100];void dfs(int step){ if(step==n+1) { for(int i=1;i<=n;i++) { printf("%d",kong[i]); } printf("\n"); return; } for(int i=0;i<n;i++) { if(book[ch[i]]==0) { book[ch[i]]=1; kong[step]=ch[i]; dfs(step+1); book[ch[i]]=0; } }}int main(){ scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&ch[i]); } dfs(1);}
2.next_permutation:#include<stdio.h>d#include<string.h>#include<algorithm>#include<math.h>using namespace std;int ch[100];int n;int main(){ scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&ch[i]); } do { for(int i=0;i<n;i++) printf("%d",ch[i]); printf("\n"); }while(next_permutation(ch,ch+n));}
若对前n-1个数字排序,只需要把ch+n变成ch+n-1,对前多少个数字排序就ch+多少,用next_permutation()排序只是从当前的数列开始,按字典序上升的顺序输出后边的数列。而perv_permutation()则是从当前出发,按字典序下降的顺序输出。
3.康拓展开
#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;typedef long long LL;int ans;LL fact[5];void getfact(int n){ fact[0]=1; for(int i=1;i<=n;i++) { fact[i]=fact[i-1]*i; }}LL cantor(int *ch,int len){ int ans=0; LL sum=0; for(int i=0;i<len;i++) { ans=0; for(int j=i+1;j<len;j++) { if(ch[j]<ch[i]) ans++; } sum+=ans*fact[len-1-i]; } return sum;}int main(){ getfact(5); int ch[4]={4,2,1,3}; printf("%d\n",cantor(ch,4));}
康拓展开是实现找到某一数列在所有的展开数列中排第几位,cantor=an*(n-1)!+an-1*(n-2)!+.........+a1*0! 此公式就是康拓展开式,
例如{4,2,1,3}排列在所有的排列中排第几,
a4-------->指4在 该数列并且能填的 中按字典序的顺序排第几名,从0开始计数,明显是3
a3-------->指2在 能填的数2,1,3中排第1,因此a3=1
a2-------->指1在 能填的数1,3中排第0,因此a2=0
a1-------->指3在能填的数中排 0,因此a1=0.
因此4213在所有的排列中排名第 3*3!+1*2!+0+0=20,(从0开始计数,排名20)
阅读全文
0 0
- 全排列算法总结
- 全排列 总结
- 排序总结+全排列
- 全排列总结
- 关于全排列的总结
- 全排列的一些总结
- 求集合的子集、全排列总结
- 算法总结(9)--全排列问题
- 全排列总结(蓝桥)
- 字符串全排列算法学习总结
- 全排列
- 全排列
- 全排列
- 全排列
- 全排列
- 全排列
- 全排列
- 全排列
- 获取浏览器版本,获取操作系统
- iOS9之后AFNetWorking的使用(详细)
- Windows Server 2008,2012,2016 NTP Server
- 中转api,一个用于转发用户的Http请求的工具
- SQL中 inner join、 left join 、right join、 outer join之间的区别
- 全排列总结
- crond和crontab
- SQLite的简单使用
- Intellij IDEA svn tomcat设置
- js标签里面添加onclick传递参数符号问题
- 什么是双线主机?双线主机租用的几种情况
- 消除当前定义的宏,来重新定义宏的值 从而让cocos2d-x变为非调试模式
- Leetcode 474 Ones and Zeroes
- K大数查询——整体二分套线段树