排列
来源:互联网 发布:javascript const var 编辑:程序博客网 时间:2024/04/28 16:46
普通集合的排列:
#include"iostream"using namespace std;int num[100];int a[100];int n;void next_permutation(int a[],int cur) //从cur 构造序列{ if(cur==n) //递归边界 当长度达到了序列的长度打印 { for(int i=0;i<cur;i++) cout<<a[i]<<" "; cout<<endl; return; } for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur] { int ok=1; for(int j=0;j<cur;j++) //检查这个元素是否合法 if(num[i]==a[j]) {ok=0;break;} //如果在0...cur-1中出现过说明不可选 if(ok) //如果可选 赋值给a[cur],继续构造。 { a[cur]=num[i]; next_permutation(a,cur+1); } }}int main(){ while(cin>>n) { int i; for(i=0;i<n;i++) cin>>num[i]; cout<<"集合的全排列:"<<endl; next_permutation(a,0); }}
可重集:
#include"iostream"#include"map"using namespace std;int num[100];int a[100];int n;void next_permutation2(int a[],int cur) //从cur 构造序列{ if(cur==n) //递归边界 当长度达到了序列的长度打印 { for(int i=0;i<cur;i++) cout<<a[i]<<" "; cout<<endl; return; } for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur] { map<int,int>cnt1; map<int,int>cnt2; for(int j=0;j<cur;j++) cnt1[a[j]]++; for(int j=0;j<n;j++) cnt2[num[j]]++; if(cnt1[num[i]]<cnt2[num[i]]) { a[cur]=num[i]; next_permutation2(a,cur+1); } }}void next_permutation(int a[],int cur) //从cur 构造序列{ if(cur==n) //递归边界 当长度达到了序列的长度打印 { for(int i=0;i<cur;i++) cout<<a[i]<<" "; cout<<endl; return; } for(int i=0;i<n;i++) //选出一个元素 赋值给a[cur] { int c1,c2;c1=c2=0; for(int j=0;j<cur;j++) if(a[j]==num[i]) c1++; //在a[0...cur-1]中等于num[i]的元素的个数 for(int j=0;j<n;j++) if(num[j]==num[i]) c2++; //在num[0...n-1]中等于num[i]的元素的个数 if(c1<c2) //说明这个元素还没有用完,可以选择 { a[cur]=num[i]; next_permutation(a,cur+1); } }}int main(){ while(cin>>n) { int i; for(i=0;i<n;i++) cin>>num[i]; cout<<"可重集合的全排列:"<<endl; next_permutation(a,0); cout<<"可重集合的全排列:"<<endl; next_permutation2(a,0); }}
STL 函数next_permutation(_BidirectionalIterator __first,_BidirectionalIterator __last):
#include"iostream"#include"map"#include"algorithm"using namespace std;int num[100];int a[100];int n;int main(){ while(cin>>n) { int i; for(i=0;i<n;i++) cin>>num[i]; do { for(i=0;i<n;i++) cout<<num[i]<<" "; cout<<endl; }while(next_permutation(num,num+n)); }}
0 0
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- 排列
- Fragment中startActivityForResult不回调onActivityResult问题
- 机器学习工程师需要了解的十种算法
- 递归法求解矩阵行列式
- CodeForces 689B
- NYOJ 170 网络的可靠性
- 排列
- 接到猎头电话,一定要做好这些事!
- 不要相信程序员在加班时间写的代码
- POJ 2513 Colored Sticks (排序+并查集判断欧拉路)
- Android学习之使用高德地图高航
- Async Task 详解 与主线程(UI)交互的异步处理
- 线程的分离状态
- 【codeforcse 707B Bakery】
- Android NestedScrolling机制完全解析 带你玩转嵌套滑动