生成全排列

来源:互联网 发布:足球游戏源码 编辑:程序博客网 时间:2024/05/20 20:04

1、生成1~n的全排列

#include <iostream>using namespace std;void list(int n,int *a,int cur){if(n==cur){for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}elsefor(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;list(n,a,cur+1);}}}int main(int argc, char **argv){int n,a[10];cin>>n;list(n,a,0);return 0;}


对上面时间上改进:

#include <iostream>#include <cstring>using namespace std;int n,a[10],f[10];void list(int cur){if(n==cur){for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}elsefor(int i=1;i<=n;i++){if(!f[i]){a[cur]=i;f[i]=1;list(cur+1);f[i]=0;}}}int main(int argc, char **argv){cin>>n;memset(f,0,sizeof(f));list(0);return 0;}


2、生成可重集的排列

#include <iostream>using namespace std;void list(int n,int *a,int *p,int cur){if(n==cur){for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}elsefor(int i=0;i<n;i++)if(!i||p[i]!=p[i-1]){int c1=0,c2=0;for(int j=0;j<cur;j++)if(a[j]==p[i])c1++;for(int j=0;j<n;j++)if(p[j]==p[i])c2++;if(c1<c2){a[cur]=p[i];list(n,a,p,cur+1);}}}int main(int argc, char **argv){int n,a[10],p[10];cin>>n;for(int i=0;i<n;i++)cin>>p[i];list(n,a,p,0);return 0;}


3、C++的STL库函数next_permutation(),可实现上述两种情况:

 

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