枚举排列
来源:互联网 发布:解毒丹 知乎 编辑:程序博客网 时间:2024/06/05 14:48
1.生成1~n的排列
代码:
#include<iostream>#include<cstdio>#include<string.h>using namespace std;int sum=0;void print_permutation(int cur,int *a,int n){ if(cur==n) { for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; sum++; } 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; print_permutation(cur+1,a,n); } }}int main(){ int a[50],p[50]; memset(a,0,sizeof(a)); int n; cin>>n; print_permutation(0,a,n); cout<<sum<<endl;}
2.生成可重集的排列
只能是连续数的重复,如:1,1,1,2,3,4等。不可以对1,2,1,2.进行排列。
#include<iostream>#include<cstdio>#include<string.h>using namespace std;int sum=0;void print_permutation(int *p,int cur,int *a,int n){ if(cur==n) { for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; sum++; } else for(int i=0;i<=n;i++) if(!i||p[i]!=p[i-1]) { int c1=0,c2=0; for(int j=0;j<n;j++) { if(p[i]==p[j]) c2++; } for(int j=0;j<cur;j++) { if(a[j]==p[i]) c1++; } if(c1<c2) { a[cur]=p[i]; print_permutation(p,cur+1,a,n); } }}int main(){ int a[50],p[50]; memset(a,0,sizeof(a)); int n; cin>>n; for(int i=0;i<n;i++) { cin>>p[i]; } print_permutation(p,0,a,n); cout<<sum<<endl;}
3.下一个排列
利用#include
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int main(){ int n,ans=0; cin>>n; int a[50]; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); do { for(int i=0;i<n;i++) { cout<<a[i]<<" "; } cout<<endl; ans++; }while(next_permutation(a,a+n)); cout<<ans<<endl;}
阅读全文
0 0
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 枚举排列
- 关于排列枚举算法
- 递归枚举全排列
- 枚举全排列
- 枚举全排列
- 流水灯指示跑
- 《UNIX环境高级编程》笔记2--UNIX标准化及实现
- 【Mybatis升级版-03】Controller方法的返回值
- idea创建springcloud项目图文教程(Feign实现负载均衡)(九)
- 《UNIX网络编程 卷2》 笔记: Posix消息队列(2)
- 枚举排列
- C语言内存管理函数总结(1)
- springboot学习三(springboot结合spring data jpa和freemarker显示)
- vue 页面跳转,传数据
- FreeRTOS列表和列表项
- npm包change-version的编写
- collections 模块整理
- ssm练手(CRUD) 2、修改sql方法,并利用JUnit结合数据库进行测试
- HDU 6191 DFS序+可持久化字典树