题目描述
对于固定数组:{0,1,2,3,4,5,6,7,8,9}
输入布尔数组:{0,1,1,1,1,1,1,1,1,0},其中0表示对应下标元素可出现也可以不出现,1表示必须出现。
输出所有可能性组合,转化为字符串,并按照升序排序
如上例输出结果为:
012345678
0123456789
12345678
123456789
算法思路
对于任意一个01序列 如 0111111110 遍历该数组,遇到1时,将对于数子加入字符串即可,遇到0时,则分为两种情况,加入该数字或者不加,对两种情况分别递归!
void combination(const int* boolArr,vector<string>& strlist,
string& str,int start)
{
if(start==10)
{
//递归截止条件,并添加对应字符串到strlist中保存
strlist.push_back(str);
return;
}
char ch=start-0+'0';
if(boolArr[start]==1)
{
str.push_back(ch);
combination(boolArr,strlist,str,start+1);
str.pop_back();
}
else
{
//将0对应字符加入的情况
str.push_back(ch);
combination(boolArr,strlist,str,start+1);
str.pop_back();
//不加的情况
combination(boolArr,strlist,str,start+1);
}
}
int main()
{
int nums[10];
for(int i=0;i<10;++i)
cin>>nums[i];
vector<string> strlist;
string str;
combination(nums,strlist,str,0);
sort(strlist.begin(),strlist.end());
int len=strlist.size();
for(int i=0;i<len;++i)
{
cout<<strlist[i]<<endl;
}
return 0;
}