算法竞赛入门经典读书笔记(三)7.2枚举排列

来源:互联网 发布:js require方法 编辑:程序博客网 时间:2024/04/29 09:26

7.2.1生成1~n的所有排列

递归调用的方法可以实现。

#include <iostream>using namespace std;void print_permutation(int n,int *A,int cur){int i,j;if(cur==n){for(i=0;i<n;i++) cout<<A[i];cout<<endl;}else for(i=1;i<=n;i++){int ok=1;for(j=0;j<cur;j++)if(A[j]==i) ok=0;if(ok){A[cur]=i;print_permutation(n,A,cur+1);}}}int main(){int n,A[100],cur=0;cout<<"请输入整数n(n<=100):\n";while(cin>>n){for(int i=0;i<n;i++){A[i]=i+1;} print_permutation(n,A,cur);}return 0;}

生成可重集的排序

#include <iostream>#include <algorithm>using namespace std;void print_permutation(int n,int *P,int *A,int cur){int i,j;if(cur==n){for(i=0;i<n;i++) cout<<A[i]<<" ";cout<<endl;}else for(i=0;i<n;i++)if(!i||P[i]!=P[i-1]){int c1=0,c2=0;for(j=0;j<cur;j++) if(A[j]==P[i]) c1++;for(j=0;j<n;j++) if(P[j]==P[i]) c2++;if(c1<c2){A[cur]=P[i];print_permutation(n,P,A,cur+1);}}}int main(){int n,A[100],cur;int P[100];cin>>n;for(int i=0;i<n;i++)  cin>>P[i]; sort(P,P+n);cur=0;print_permutation(n,P,A,cur);return 0;}


附:利用STL中的algorithm也可以~~灰常简单地说

#include <iostream>#include <algorithm>using namespace std;int main(){int n,A[100],cur=0;cout<<"请输入整数n(n<=100):\n";cin>>n;int i;for(i=0;i<n;i++){A[i]=i+1;} do{for(i=0;i<n;i++) cout<<A[i];cout<<endl;}while(next_permutation(A,A+i));return 0;}

利用stl生成给定集合的全排列

#include<iostream>#include<algorithm>using namespace std;int main(){int n,p[10];cin>>n;for(int i=0;i<n;i++){cin>>p[i];}cout<<endl;sort(p,p+n);do{for(int i=0;i<n;i++)cout<<p[i]<<" ";cout<<endl;}while(next_permutation(p,p+n));return 0;}