2016-07-08 11 views
0

m×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ループが必要です。上記の例では、Iはコード書いた: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]}}}"); 
      } 
     } 

を、forループの数も変化します。しかし、私がコードを書いたとき、mは不明です。どうすれば解決できますか?

+0

アルゴリズムタグを削除し、該当する言語タグを追加してください与えます –

答えて

0

アクティブな組み合わせのリストを更新しますccを配列の最初の行に初期化します。その後、すべての追加行を繰り返し、cを更新します。基本的には、各行の項目ごとに現在の組み合わせをそれぞれ増やします。要素(n^mセット)の

c = array[0]; //read: the first row of the array 
for(var i = 1; i < m; ++i) { //iterate all rows 
    var c_modified = []; 
    for(var j = 0; j < n; ++j) { //iterate all row entries 
     for(var k = 0; k < c.length; ++k) { //iterate all entries of c 
      add c[k].array[i, j] to c_modified; // . represents concatenation 
     } 
    } 
    c = c_modified; 
} 
0

この組み合わせデカルト積と呼ばれている。ここではいくつかの擬似コードです。いくつかの言語ライブラリでその生成のためにすぐに使用できる関数があります。

私は最も簡単なコードは再帰的なものだと信じています。

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 
関連する問題