一个简单的字符组合算法
有个朋友问了我这个问题:
把几个数组里面的元素任意组合 并输出所有组合。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?
3 a c t ?
5 b e s 4 * ?
4 3 - a #
?
//思路:
//从第一行往下走,每走一步输出一个字符,走到\0行时,输出换行
//如果row行的col列是\0时,说明下面的行枚举完了,则要返回上一行的下一列的字符,再往下面的行枚举