生成全排列
来源:互联网 发布:足球游戏源码 编辑:程序博客网 时间: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;}
- 全排列生成
- 生成全排列
- 生成全排列
- 生成全排列
- 全排列生成算法
- 全排列的生成
- 生成全排列
- 全排列的生成
- 如何生成全排列
- 全排列生成算法 .
- 生成全排列
- 全排列生成算法
- 全排列生成 Permutations
- 全排列生成算法
- 全排列生成
- 全排列生成算法
- 生成全排列
- 生成全排列
- fzu-1099
- android -- 蓝牙 bluetooth (一) 入门
- C#的数据类型和表达式
- C++ 友元 总结
- Java线程安全系列(1)--Servlet线程安全
- 生成全排列
- 6个有用的MySQL语句
- AUTOSAR
- android调试工具集
- Attach函数的讲解
- ThinkPHP3.1快速入门(2)数据CURD
- ZOJ 2634 Collecting Stones
- 修改Android中strings.xml文件及转义字符
- 对封装的理解