矩阵元素组合

时间:2016-07-08 06:56:10

标签: algorithm loops matrix

有一个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是未知的。我该如何解决?

2 个答案:

答案 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