为了账号安全,请及时绑定邮箱和手机立即绑定

生成所有可能的组合

生成所有可能的组合

C#
青春有我 2019-06-16 14:29:43
生成所有可能的组合给定2个阵列Array1 = {a,b,c...n}和Array2 = {10,20,15....x}如何将所有可能的组合生成为StringA(I)b(J)c(K)n(P)哪里1 <= i <= 10,  1 <= j <= 20 , 1 <= k <= 15,  .... 1 <= p <= x例如:a1 b1 c1 .... n1   a1 b1 c1..... n2   ......  ......  a10 b20 c15 nx (last combination)因此,在所有组合的总数中=元素的乘积array2 = (10 X 20 X 15 X ..X x)类似于笛卡尔积,其中第二个数组定义了第一个数组中每个元素的上限。有固定数字的例子,    Array x =  [a,b,c]     Array y =  [3,2,4]所以我们会有3*2*4=24个组合。结果应是:    a1 b1 c1       a1 b1 c2       a1 b1 c3       a1 b1 c4       a1 b2 c1       a1 b2 c2       a1 b2 c3       a1 b2 c4     a2 b1 c1       a2 b1 c2       a2 b1 c3       a2 b1 c4       a2 b2 c1       a2 b2 c2       a2 b2 c3       a2 b2 c4     a3 b1 c1       a3 b1 c2       a3 b1 c3       a3 b1 c4       a3 b2 c1       a3 b2 c2       a3 b2 c3       a3 b2 c4 (last)
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

using System;using System.Text;public static string[] GenerateCombinations(string[] Array1, int[] Array2){
    if(Array1 == null) throw new ArgumentNullException("Array1");
    if(Array2 == null) throw new ArgumentNullException("Array2");
    if(Array1.Length != Array2.Length)
        throw new ArgumentException("Must be the same size as Array1.", "Array2");

    if(Array1.Length == 0)
        return new string[0];

    int outputSize = 1;
    var current = new int[Array1.Length];
    for(int i = 0; i < current.Length; ++i)
    {
        if(Array2[i] < 1)
            throw new ArgumentException("Contains invalid values.", "Array2");
        if(Array1[i] == null)
            throw new ArgumentException("Contains null values.", "Array1");
        outputSize *= Array2[i];
        current[i] = 1;
    }

    var result = new string[outputSize];
    for(int i = 0; i < outputSize; ++i)
    {
        var sb = new StringBuilder();
        for(int j = 0; j < current.Length; ++j)
        {
            sb.Append(Array1[j]);
            sb.Append(current[j].ToString());
            if(j != current.Length - 1)
                sb.Append(' ');
        }
        result[i] = sb.ToString();
        int incrementIndex = current.Length - 1;
        while(incrementIndex >= 0 && current[incrementIndex] == Array2[incrementIndex])
        {
                current[incrementIndex] = 1;
                --incrementIndex;
        }
        if(incrementIndex >= 0)
            ++current[incrementIndex];
    }
    return result;}


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 685 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信