一个简单的字符组合算法

有个朋友问了我这个问题:

把几个数组里面的元素任意组合 并输出所有组合。C++中是有相关的函数,我们自己来实现一下吧。

当然大家一开始就会想到用递归,下面就给出简单的源码。

 

#include <iostream>
using namespace std;

char arr[100][100];

void work(int row, int col, char* str);

int main()
{
	int n,i,j,tmp;
	char* str;
	
	//输入
	cin>>n; //n个数组
	for(i = 0; i < n; i ++)
	{
		cin>>tmp;
		for(j = 0; j < tmp; j ++)
		{
			cin>>arr[i][j];
		}
		arr[i][j] = '\0';
	}
	arr[i][0] = '\0'; //把最后一行标记为\0
	
	//开始处理	
	str = (char*)malloc((n+1)*sizeof(char));
	work(0,0,str); //从0行0列开始处理
	cin>>n; //没多大用处,就是让程序停一下,看一下结果
	return 0;
}

void work(int row, int col, char* str) 
{	//函数中要访问的是row行的col列
	if(arr[row][0] == '\0') //到最后一行了,可以输出了
	{
		str[row] = '\0';
		cout<<str<<endl;
		return;
	}
	if(arr[row][col] == '\0') //到最后一列了,要换回上一行
	{	
		return;
	}
	
	//不是最后一行,也不是最后一列,输出,并枚举下面的行
	str[row] = arr[row][col];
	work(row+1,0,str);
	work(row,col+1,str);
}

 //测试数据:

3  //表示下面有三行,每行都不为空

3 a c t      //第一行,开关数字表示后面有几个字符

5 b e s 4 *  //第二行,开关数字表示后面有几个字符

4 3 - a #    //第三行,开关数字表示后面有几个字符

 

2

2 a b

2 1 2

 

3 a c t  

5 b e s 4 *  

4 3 - a #

 

//思路:

//从第一行往下走,每走一步输出一个字符,走到\0行时,输出换行

//如果row行的col列是\0时,说明下面的行枚举完了,则要返回上一行的下一列的字符,再往下面的行枚举

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值