2

2Dポイントの配列が2つあります。

array1 = int[x][2]
array2 = int[y][2]

この2つの配列から、4つのポイントの組み合わせを生成したいと思います。結果はリストに表示されます。

List<int[4][2]>

ただし、組み合わせごとにarray1から取得するポイントの数を指定する必要があります(残りはarray2から取得します)。ポイントの順番は関係ありません。そして、繰り返しがあってはなりません。

例えば:

array1={ {0,0} , {0,1} , {1,0} }
array2= { {1,1} , {2,1} , {2,2} , ... , {9,9} }

(array1から1ポイント、array2から3ポイントを取得します)

res= { {0,0} , {1,1} , {2,1} , {2,2} }
     { {0,0} , {1,1} , {2,1} , {3,2} }
     ...
     { {0,0} , {1,1} , {2,1} , {9,9} }
     ...
     { {0,1} , {1,1} , {2,1} , {2,2} }
     ...

一度もない :

res = { {0,0} , {1,1} , {1,1} , {1,1} }
      ...

ない :

res= { {0,0} , {1,1} , {2,1} , {2,2} }
     { {0,0} , {1,1} , {2,2} , {2,1} }
     ...

(array1から2ポイント、array2から2ポイントを取得します)

..。

(array1から3ポイント、array2から1ポイントを取得します)

..。

私は多くの答えを読んだりテストしたりするのに何時間も費やし、解決策を見つけることができなかったので、誰かがこれについて私を助けてくれることを願っています。

PS /編集:C#でコードを提供できれば、それは素晴らしいことです。

4

2 に答える 2

3

この質問は、元の配列に格納されている順序でのみポイントを取得できるという規定によって簡略化されています。

編集:この質問は、結果に順列ではなく組み合わせを含める必要があるというあなたの規定によって簡略化されています。したがって、物事を単純化するために、元の配列に格納されている順序でポイントを取得できます。これにより、ポイントの並べ替えが回避されます。

他の言語からの翻訳を申し出たので、JavaScriptを使用します。JavaScript配列には長さが含まれているため、長さを個別に渡す必要があります(または、配列の最後を渡す必要があります)。

function combinations(array1, count1, array2, count2)
{
    var result = [];
    combine(array1, 0, count1, array2, 0, count2, [], result);
    return result;
}

function combine(array1, offset1, count1, array2, offset2, count2, chosen, result)
{
    var i;
    var temp;
    if (count1) {
        count1--;
        for (i = offset1; i < array1.length - count1; i++) {
            temp = chosen.concat([array1[i]]); // this copies the array and appends the item
            combine(array1, i + 1, count1, array2, offset2, count2, temp, result);
        }
    } else if (count2) {
        count2--;
        for (i = offset2; i < array2.length - count2; i++) {
            temp = chosen.concat([array2[i]]);
            combine(null, 0, 0, array2, i, count2, temp, result);
        }
    } else {
        result.push(chosen); // don't need to copy here, just accumulate results
    }
}
于 2012-11-25T01:03:45.177 に答える
1

Combinatorics Library for .NetNuget経由でダウンロードします。

私はそれを試してみました:

    Dim a1 = {New Integer() {0, 0}, New Integer() {1, 1}, New Integer() {2, 2}}
    Dim a2 = {New Integer() {3, 3}, New Integer() {4, 4}, New Integer() {5, 5}, New Integer() {6, 6}}

    Dim combA1 = New Combinations(Of Integer())(a1, 1)
    Dim combA2 = New Combinations(Of Integer())(a2, 3)

    Dim l As New List(Of Integer()())
    For Each i In combA1
        For Each j In combA2
            l.Add(i.Union(j).ToArray)
        Next
    Next

Combinatorics.Collections名前空間をインポートすることを忘れないでください。結果は私には問題ないように見えましたが、おそらくもう少し時間をかけて確認することをお勧めします。forループは、単純なLINQステートメントで置き換えることができるように見えますが、機能します。

于 2012-11-25T01:02:17.747 に答える