我有一个整数数组,例如:
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个元素。
有人有解决方案吗?
答案 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()));
}
}
}