比如123, 那么就有123, 132, 213, 231, 312, 321. 六种组合.
这个问题很久前就看过, 但是一直都没去关注(因为关注了也做不出来- -||). 就在今天, 我突然就想要解开这个题, 说干就干, 苦思冥想之后, 完全没有头绪. 在百度上搜索了一番之后, 终于在CSDN上找到了一模一样的问题. 解题方法相当繁琐.
解题代码:
int main()
{
int Array[] = {1, 2, 3, 4};
size_t len = sizeof(Array);
size_t len = 4;
for (size_t i1 = 0; i1 != len; ++i1)
{
for (size_t i2 = 0; i2 != len; ++i2)
{
if (i2 != i1)
{
for (size_t i3 = 0; i3 != len; ++i3)
{
if (i3 != i2 && i3 != i1)
{
for (size_t i4 = 0; i4 != len; ++i4)
{
if (i4 != i1 && i4 != i2 && i4 != i3)
{
cout << Array[i1] << " "
<< Array[i2] << " "
<< Array[i3] << " "
<< Array[i4] << endl;
}
}
}
}
}
}
}
return 0;
}
这个办法实在不方便, 4个数字4层循环, 当时发帖的作者也是寻求有没有递归的解法.
在我折腾了一个下午之后, 终于得到了相对满意的答案.
以下是递归算法:
void fun4(queue<int> &Queue, const int bit, int *pResult, const int len)
{
if (bit != 0)
{
for (size_t i = 0; i != bit; ++i)
{
int num = Queue.front();
Queue.pop();
pResult[bit-1] = num;
if ( bit == 1)
{
PrintArray(pResult, len);
}
fun4(Queue, bit-1, pResult, len);
Queue.push(num);
}
}
}
int main()
{
int Array[] = {1, 2, 3, 4};
queue<int> Queue;
for (size_t i = 0; i != sizeof(Array)/sizeof(int); ++i)
{
Queue.push(Array[i]);
}
int Result[4];
fun4(Queue, 4, Result, sizeof(Array)/sizeof(int));
return 0;
}
这个递归貌似也不比那4层循环快多少, 至少用起来就方便多了.
在下纯粹新手, 望各位高手多多赐教…^_^.