生成所有可能的组合给定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;}
- 3 回答
- 0 关注
- 710 浏览
添加回答
举报
0/150
提交
取消