CHEETAH.W

静心积累

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
/*
* 解决任意长度字串中取任意个数N的组合情况
* 程序:一纯(CH.W)
* 时间:2011/5/4
*/

室友LWZ在这学期初期上算法设计——迭代算法时提出的问题。

算法的实现以类(class Combination)的形式给出,核心是个f_c函数,用来迭代计算。数据结构是以标准库容器vector存储。可以解决任意输入字符长度(<100)的取N个的组合问题。代码附属功能是把控制台显示的内容(包括结果在内)写入result.txt文件中。

1 /*
2 * 定义组合类
3  */
4 typedef class Combination{
5  public:
6 /*
7 * 默认构造1
8 */
9 Combination();
10 /*
11 * 带参构造
12 */
13 Combination(char* src_in, int N_in, bool go);
14 /*
15 * 析构
16 */
17 ~Combination();
18 /*
19 * 设置src
20 */
21 int Set_src(char* _in);
22 /*
23 * 设置N
24 */
25 int Set_N(int _in);
26 /*
27 * 得到res_n
28 */
29 int Get_res_n();
30 /*
31 * 启动计算
32 */
33 int Start();
34
35  private:
36 vector<char> src; // 原字符串
37   int N; // 取得N个
38   int res_n; // 结果个数
39 /*
40 * 迭代计算
41 */
42 int F_c(vector<char> src,
43 vector<char>::iterator beginIt,
44 vector<char>::iterator endIt,
45 int getN,
46 vector<char> dest);
47 }Com,*pCom;

F_c函数的定义:

1 /*
2 * 迭代计算(递归)
3 */
4 int Combination::F_c(vector<char> src,
5 vector<char>::iterator beginIt,
6 vector<char>::iterator endIt,
7 int getN,
8 vector<char> dest){
9 vector<char> sta_now(beginIt,endIt);
10 if(getN <= (signed int)sta_now.size()){
11 if(getN == 0){
12 // 输出结果
13 res_n++;
14 PrintVector(dest);
15 if((res_n)%5 == 0){
16 printf("\r\n");
17 }
18 return -1;
19 }
20 dest.push_back(*beginIt);
21 F_c(sta_now,beginIt+1,endIt,getN-1,dest);
22 dest.pop_back();
23 F_c(sta_now,beginIt+1,endIt,getN,dest);
24 }
25 return -2;
26 }

从参数列表中可以看出,vector<char> src作为整个原集合的数组,vector<char>::iterator beginIt和vector<char>::iterator endIt,定义了本次处理的部分,int getN用来表示本次处理部分需要取出多少个元素加入本次结果,儿最后一个vector<char> dest则储存当前迭代进程所取到的元素,也就是解集。

两个if语句定义了结束条件:
(要取的元素个数≤当前处理集合的大小)即当前集合不够取,则终止 次迭代树分支。
(要取的元素个数=0)即在当前集合中不需要取元素。 

20~21这两行,把本次集合第一个元素放进结果集,探索除去第一个元素后的集合,在里面找getN-1个元素。(取第一个元素,后面取getN-1个元素)
22~23这两行,把刚刚放入的第一个元素弹出,探索除去第一个元素后的集合,里面找getN个元素(不取第一个元素,后面取getN个元素)

PS:本文只针对算法进行说明,数据的输入输出和存放,文件的操作都不进行说明。

vs2008项目:Problem_of_Combination.zip

posted on 2011-05-15 11:03  Ethan.Wong  阅读(538)  评论(0编辑  收藏  举报