排列&组合
2013-10-14 14:47
232 查看
1. 问题描述:int数组的全排列
思路:
递归思想,分两步,首先求所有可能出现在第一个位置的数字,即把第一个位置的数字与后面每一个位置相调换;第二部固定一个字符,求后面剩下位置的全排列。某一个位置的递归完成后,要回到最开始的情况,以便和下一个位置再做调换。
例:
1,2,3 ---> 1| 2,3 --> 1| 3 2 -- > 回到1 2 3
---> 2| 1,3 --> 2| 3 1 --> 回到 123
---> 3| 2,1 -- > 3| 1 2
2. 问题描述:int数组的组合
思路:以{1, 2, 3}为例,
输出位中,第一位上可能出现1-3;第二位上可能出现2-3;第三位上可能出现3。故采用递归,先设置第一位,再从第二位中可能出现的数里一次选一个放入第二位(从第一位上的数字的下一个位置开始选,防止11现象的出现);依次类推,没选中一位,就输出一次。
思路:
递归思想,分两步,首先求所有可能出现在第一个位置的数字,即把第一个位置的数字与后面每一个位置相调换;第二部固定一个字符,求后面剩下位置的全排列。某一个位置的递归完成后,要回到最开始的情况,以便和下一个位置再做调换。
例:
1,2,3 ---> 1| 2,3 --> 1| 3 2 -- > 回到1 2 3
---> 2| 1,3 --> 2| 3 1 --> 回到 123
---> 3| 2,1 -- > 3| 1 2
void permutation(int* a, int begin, const int n) { if(begin < n) { int tmp = 0; for(int i = begin; i < n; ++i) { tmp = a[begin]; a[begin] = a[i]; a[i] = tmp; permutation(a, begin + 1, n); tmp = a[begin]; a[begin] = a[i]; a[i] = tmp; } } else { for(int i = 0; i < n; ++i) cout<<a[i]<<" "; cout<<endl; } }
2. 问题描述:int数组的组合
思路:以{1, 2, 3}为例,
输出位中,第一位上可能出现1-3;第二位上可能出现2-3;第三位上可能出现3。故采用递归,先设置第一位,再从第二位中可能出现的数里一次选一个放入第二位(从第一位上的数字的下一个位置开始选,防止11现象的出现);依次类推,没选中一位,就输出一次。
void combination(int* a, int* rst, int begin, int index, int n) { if(a == NULL || n < 1) return; for(int i = begin; i < n; ++i) { rst[index] = a[i]; for(int j = 0; j <= index; ++j) cout<<rst[j] << " "; cout << endl; if(i < n - 1) combination(a, rst, begin+1, index+1, n); } }
相关文章推荐
- 排列&组合数学
- 序列图中组合片段连接多个生命线(UML2序列图组合片段的应用)
- DataSnap DBGrid DateTimePicker 组合输入日期值
- Java设计模式:组合模式 Component
- java设计模式10_组合模式
- 排列组合公式
- 索引优化系列十五--组合查询和in有关的优化
- BZOJ 2729: [HNOI2012]排队|排列组合
- 关于C语言中*与++的组合问题解析
- 一些常用集合算法——之组合生成
- 设计模式之组合模式
- 42-44组合模式
- 函数式编程思想:耦合和组合,第2部分
- java设计模式--组合模式(9)
- 设计模式之组合模式(Composite)摘录
- 设计模式理解(七)结构型——组合模式
- 14-JavaScript设计模式——组合模式
- LVS与heartbeat的组合on rhel5
- 20140610 PP中可以绘制表格;PPT组合之后再加效果
- 学习UML实现、泛化、依赖、关联、聚合、组合