1

私が達成しようとしていることを表す CS 用語があると確信していますが、それが何であるかはわかりません。a3 つの配列があります。それらを 、b、および と呼びましょうc。反復となる配列のすべての可能な組み合わせを反復していa*b*cます。

int現在の反復 (iterationから0まで ) と、、a*b*c-1および の長さの関数を渡しています。その関数が、反復回数と、、および の長さだけから計算された、インデックスのすべての一意の順列を出力できるようにしたいと考えています。abcabc

これは私が今持っているものです:

class Test {
    public static void printIndices(int i, int a, int b, int c) {
        System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);
    }

    public static void main(String[] args) {
        int a[] = new int[2];
        int b[] = new int[2];
        int c[] = new int[3];

        int iterations = a.length * b.length * c.length;

        for (int i=0; i < iterations; i++){
            printIndices(i, a.length, b.length, c.length);
        }
    }
}

次の出力が生成されます。

0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1
0, 1, 2
1, 0, 0
0, 1, 1
1, 0, 2
0, 1, 0
1, 0, 1

ご覧のとおり、重複があります。出力を次のようにしたい:

0, 0, 0
1, 0, 0
0, 1, 0
1, 1, 0
0, 0, 1
1, 0, 1
0, 1, 1
1, 1, 1
0, 0, 2
1, 0, 2
0, 1, 2
1, 1, 2

(すべての順列に重複がない限り、順序は重要ではありません)。

明らかに私の出力行は間違っています:

System.out.println(i%a + ", " + (i+1)%b + ", " + (i+2)%c);

探している出力を取得するための正しい操作は何ですか?

このコードは少しばかげており、実際に行っていることとはまったく異なりますが、ケースをよく示しています。

4

1 に答える 1

4

コメントで述べたように、デカルト積を探しています。

モジュラ演算を使用したアプローチはほとんど機能します。正しい結果を得るには、いくつかの変更のみが必要です。

System.out.println(i%a + ", " + (i/a)%b + ", " + (i/a/b)%c);

オンラインでの動作を確認してください: ideone

于 2012-06-18T17:24:51.393 に答える