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; }