1

私が求めているのは、同じ要素の指定された数を保持する、指定されたサイズの配列のさまざまなバリエーションすべてのリストをどのように初期化できるかということです。

したがって、たとえば、同じ要素を 3 つ保持するサイズ 5 の配列は、これらの方法で実行できます。ここで、X は要素であり、O は空のスペースです。

1) [X, X, X, O, O]

2) [X, X, O, X, O]

3) [X, X, O, O, X]

4) [X, O, X, X, O]

5) [X, O, X, O, X]

6) [X, O, O, X, X]

7) [O, X, X, X, O]

8) [O, X, X, O, X]

9) [O, X, O, X, X]

10) [O, O, X, X, X]

この種の結果を作成するには、どのアルゴリズムを使用できますか?

4

1 に答える 1

1

再帰アルゴリズムを使用して、考えられるすべての順列を生成できます。

public static void main(String[] args) {
    ArrayList<char[]> list = new ArrayList<char[]>();
    char[] c = {'O', 'O', 'O', 'O', 'O'};
    nextArray(list, c, 0, 3);
}

public static void nextArray(List<char[]> list, char[] array, int index, int changes) {
    if(index == array.length) return;
    if(changes == 0) {
        list.add(array);
        return;
    }

    char[] a1 = Arrays.copyOf(array, array.length);
    a1[index] = 'X';

    nextArray(list, a1, index+1, changes-1);
    nextArray(list, Arrays.copyOf(array, array.length), index+1, changes);
}

アイデアは、一度に 1 つのインデックスを変更することです (インデックスを変更する回数を追跡します) changes = 0。次に、その配列を追加し、再帰のためにそのブランチを終了します。

于 2016-04-06T04:15:23.963 に答える