有一个m x n数组,我需要输出每行可能的组合元素。例如,对于数组{{1,2,3},{4,5,6}}
,我需要输出{{1,4},{1,5},{1,6},{2,4},{2,5},{2,6},{3,4},{3,5},{3,6}}
。
我认为应该有一个m循环来解决这个问题。对于上面的例子,我编写了代码:
int[,] array = new int[,] {{1, 2, 3}, {4, 5, 6}};
for (var i = 0; i < 3; i++)
{
for (var j = 0; j < 3; j++)
{
Console.WriteLine($"{{{array[0, i]},{array[1, j]}}}");
}
}
随着m的变化,for
循环的数量也会发生变化。但是当我编写代码时,m是未知的。我该如何解决?
答案 0 :(得分:0)
维护有效组合列表.csproj
。将c
初始化为数组的第一行。然后迭代每一行并更新c
。基本上,您使用每个行的项目扩充每个当前组合。这是一些伪代码:
c
答案 1 :(得分:0)
这些元素组合(n^m
集)称为笛卡尔积。在一些语言库中有一些现成的函数可供生成
我认为最简单的代码是递归代码。
type
TArr2D = TArray<TArray<Integer>>;
procedure CartesianProduct(const A: TArr2D; Line: Integer; Reslt: TArray<Integer>);
var
i: integer;
begin
if Line > High(A) then
Memo1.Lines.Add(ArrayToString(Reslt)) // output m-element set
else
for i in A[Line] do
CartesianProduct(A, Line + 1, Reslt + [i]); // include element in set
end;
var
A: TArr2D;
n, m, i, j: Integer;
begin
m := 3;
n := 3;
SetLength(A, m, n);
for j := 0 to m - 1 do
for i := 0 to n - 1 do
A[j, i] := j * n + i;
//0 1 2
//3 4 5
//6 7 8
CartesianProduct(A, 0, []);
给出
0 3 6
0 3 7
0 3 8
0 4 6
0 4 7
0 4 8
0 5 6
0 5 7
0 5 8
1 3 6
1 3 7
1 3 8
1 4 6
1 4 7
1 4 8
1 5 6
1 5 7
1 5 8
2 3 6
2 3 7
2 3 8
2 4 6
2 4 7
2 4 8
2 5 6
2 5 7
2 5 8