整数数组 - 索引组合

时间:2017-05-16 08:14:03

标签: c# arrays

我有一个整数数组,例如:

int[][] matrix = new int[][] { 
    new int[2],  // array a,
    new int[2],  // array b,
    new int[3],  // array c,
    new int[4],  // array d,
    // ...       // array x
};

现在我想生成所有可能的索引组合从每个数组a,b,c,...中选择一个x

这意味着在以下示例中:{new int [2],new int [2],new int [3]},我想得到这样的索引组合:

{a[0], b[0], c[0]}
{a[0], b[0], c[1]}
{a[0], b[0], c[2]}
{a[0], b[1], c[0]}
{a[0], b[1], c[1]}
{a[0], b[1], c[2]}
{a[1], b[0], c[0]}
{a[1], b[0], c[1]}
{a[1], b[0], c[2]}
{a[1], b[1], c[0]}
{a[1], b[1], c[1]}
{a[1], b[1], c[2]}

矩阵的长度未知,但矩阵中的每个数组至少有1个元素。

有人有解决方案吗?

2 个答案:

答案 0 :(得分:1)

这是一种生成数组{L1,L2,L3,... Ln}的所有索引组合的方法。 作为开发,您必须了解:“二进制系统,八进制系统,十进制系统,十六进制系统”。想想二元系统中0000到1111,三元系统0000到2222,4系统0000到3333。

你的问题等于从00000到abcde,而第一个数字是(a + 1) - 系统,第二个数字是(b + 1) - 系统,第三个数字是(c + 1) - 系统,等等。

想想如何从000计算到abc。

000     // start form zero, and add 1
001     // add 1 again
...
xyz     // add 1 again, it becomes to xy(z+1) 
xy(z+1) // check, if (z+1 > c), (xyz + 1) should be x(y+1)0; check again, if (y+1 > b), x(y+1)0 should be (x+1)00; check again, if (x+1 > a), (x+1)00 should be 1000.
...
00(c-2) // add 1
00(c-1) // add 1
00c     // add 1
010     // 00(c+1), should be 010
...
0b(c-1) // add 1
0bc     // add 1
100     // 0b(c+1) == 0(b+1)0 == 100
101     //
...
abc     //
1000    // ab(c+1) == a(b+1)0 == (a+1)00 == 1000
...

这是代码。

class MainClass
{
    public static void Main(string[] args)
    {
        printAll(new int[] { 2, 2, 4});
        printAll(new int[] { 3, 3, 4, 5, 6 });
        printAll(new int[] { 3, 3, 4, 5, 6, 7, 8, 9});
    }

    public static void printAll(int[] array)
    {
        int max = 1;
        for (int i = 0; i < array.Length; i++)
        {
            max *= array[i];
        }

        for (int row = 0; row < max; row++)
        {

            int[] line = new int[array.Length];

            int weight = 1;
            for (int j = 0; j < array.Length; j++)
            {
                int times = row / weight;
                // line[j] = times % array[j]; // but you want to start form 1 
                line[j] = 1 + (times % array[j]); 
                weight *= array[j];
            }

            Console.WriteLine(String.Join(",", line));
        }
    }
}

答案 1 :(得分:0)

You can try this:

 List<int> list = new List<int>(){1, 2, 3};
        List<int> lstResult = new List<int>();
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                for (int z = 0; z < 3; z++)
                {
                    //Check if it exist before adding   
                    if (!lstResult.Contains(int.Parse(list[i].ToString() + list[i].ToString() + list[z].ToString())))
                    {
                        lstResult.Add(int.Parse(list[i].ToString() + list[i].ToString() + list[z].ToString()));
                    }
                }
                 //Check if it exist before adding
                if (!lstResult.Contains(int.Parse(list[i].ToString() + list[j].ToString() + list[i].ToString())))
                {
                    lstResult.Add(int.Parse(list[i].ToString() + list[j].ToString() + list[i].ToString()));
                }
            }
        }