迭代算法——输出任意长度字串中取任意个数N的组合情况

 
  
/*
* 解决任意长度字串中取任意个数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

转载于:https://www.cnblogs.com/cheetahw/articles/2046773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值