给出若干个位数字, 计算所有不重复组合.

比如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层循环快多少, 至少用起来就方便多了.

在下纯粹新手, 望各位高手多多赐教…^_^.

    原文作者:落单的毛毛虫
    原文地址: https://blog.csdn.net/mmc1206x/article/details/18764337
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞