全排列
2015-08-25 15:34
411 查看
主要学习下递归的思路,没有考虑重复数的问题
考虑重复的数
#include<iostream> using namespace std; int A[5] = {1,2,3,4,5}; int B[5]; void permutation(int n,int curr) { if (curr == n) { for (int i = 0; i < n; i++) cout << B[i] << " "; cout << endl; return; } else { for (int j = 0; j < n; j++) { bool flag = true; //设置B[curr]为A[j] B[curr] = A[j]; //B[curr]不在集合中时,继续下一次递归 for (int i = 0; i < curr; i++) { if (B[curr] == B[i]) { flag = false; break; } } if (flag) { permutation(n, curr + 1); } } } } int main() { permutation(5,0); return 0; }
考虑重复的数
#include<iostream> #include<algorithm> using namespace std; int A[8];//目标集合 int B[8];//候选集合 void permutation(int n,int curr) { if (curr == n) { for (int i = 0; i < n-1; i++) cout << B[i] << " "; cout << B[n-1]; cout << endl; return; } else { for (int j = 0; j < n; j++) { if (!j || A[j] != A[j - 1]) { B[curr] = A[j]; int c1 = 0;//目标集合中包含B[curr]的次数 int c2 = 0;//候选集合中包含B[curr]的次数 for (int i = 0; i < curr; i++) { if (B[i] == A[j]) { c1++; } } for (int i = 0; i < n; i++) { if (A[i] == A[j]) { c2++; } } if (c1 < c2) { permutation(n, curr + 1); } } } } } int comp(const void*a, const void*b) { return *(int*)a - *(int*)b; } int main() { int N; cin >> N; for (int i = 0; i < N; i++) cin >> A[i]; qsort(A, N, sizeof(int),comp); permutation(N,0); return 0; }
相关文章推荐
- 设计模式: 自己手动写一个装饰者模式
- 教你做一款高口碑的产品
- cloudant,nothing found on db path
- CLRS 4.5用主方法求解递归式
- openssl生成RSA格式,并转为pkcs8格式
- deep learning:Theano安装攻略
- Spring的数据源配置
- mysql空间扩展 VS PostGIS
- Opencv用鼠标绘制线段
- Java实现数据结构中的栈
- visual studio has encountered an exception .this may be caused by an extension
- Android自定义日期滚动控件
- FilterImageView
- POJ 3485 Highway (贪心, 区间选点)
- poi读取excel手机号
- ClassNotFoundException
- DetachedCriteria详细使用
- 小米黎万强在Facebook讲了什么
- 配置NFS服务器
- oc中set get方法一定是对象方法