从已知的数字中找出所有的组合
原题大置如此:
比如有数字123,那么所有的组合为:
1
2
3
12
13
23
123
如果为1234的话,那么组合为
1
2
3
4
12
13
14
23
24
34
123
124
234
1234
我的答案如下:
#include <iostream.h>
//回溯
void Back(int opts[], int len, int count)
{
int index = 0;
int i;
for( i = count; i > 1; i--)
{
if (opts[i - 1] - opts[i - 2] > 1 )
{
index = i - 2;
}
}
opts[index]++;
for( i = index + 1; i < count; i++)
{
opts[i] = (i - index) + opts[index];
}
}
//打印数组
void PrintArray(int nums[], int bits[], int len)
{
int i = 0;
for(i = 0; i < len; i++)
{
cout << nums[bits[i] - 1];
}
cout << "\n";
}
void SelectNum(int nums[], int len, int counts)
{
int * opts = new int[counts];
int i = 0;
for(i = 0; i < counts; i++)
{
opts[i] = i + 1;
}
while(opts[0] <= len - counts + 1)
{
PrintArray(nums, opts, counts);
//如果已到达最后一位
if (opts[counts - 1] >= len )
{
Back(opts, len, counts);
}
else
{
//最后一位往后移一位
opts[counts - 1]++;
}
}
}
int main()
{
int len = 0;
int nums[10];
char digits[10];
cout << "请输入数字" << endl;
for(int i = 0; i < 10; i++)
{
cin >> digits[i];
if (digits[i] < '0' || digits[i] > '9')
{
break;
}
else
{
nums[i] = digits[i] - '0';
len++ ;
}
}
for(int i = 0; i < len; i++)
{
SelectNum(nums, len, i + 1);
}
}
//回溯
void Back(int opts[], int len, int count)
{
int index = 0;
int i;
for( i = count; i > 1; i--)
{
if (opts[i - 1] - opts[i - 2] > 1 )
{
index = i - 2;
}
}
opts[index]++;
for( i = index + 1; i < count; i++)
{
opts[i] = (i - index) + opts[index];
}
}
//打印数组
void PrintArray(int nums[], int bits[], int len)
{
int i = 0;
for(i = 0; i < len; i++)
{
cout << nums[bits[i] - 1];
}
cout << "\n";
}
void SelectNum(int nums[], int len, int counts)
{
int * opts = new int[counts];
int i = 0;
for(i = 0; i < counts; i++)
{
opts[i] = i + 1;
}
while(opts[0] <= len - counts + 1)
{
PrintArray(nums, opts, counts);
//如果已到达最后一位
if (opts[counts - 1] >= len )
{
Back(opts, len, counts);
}
else
{
//最后一位往后移一位
opts[counts - 1]++;
}
}
}
int main()
{
int len = 0;
int nums[10];
char digits[10];
cout << "请输入数字" << endl;
for(int i = 0; i < 10; i++)
{
cin >> digits[i];
if (digits[i] < '0' || digits[i] > '9')
{
break;
}
else
{
nums[i] = digits[i] - '0';
len++ ;
}
}
for(int i = 0; i < len; i++)
{
SelectNum(nums, len, i + 1);
}
}