1

以下は、ヨセフス問題 (人々が円形に配置され、残りの 1 人になるまで他のすべての人が殺される問題) に対する1 つの解決策です。

import java.util.ArrayList;

public class test {

public static void main(String[] args) {

    ArrayList<Integer> chairArr = new ArrayList<Integer>();


    for (int i = 1; i <= 10; i++) {
        chairArr.add(i);
    }

    int result = 0;

    for (int i = 1; i < chairArr.size() - 1; i = i + 2) {
        chairArr.add(chairArr.get(i));
        result = i;
    }


    System.out.print("Result: " + chairArr.get(result));
    }
}

しかし、他のすべての人をスキップするのではなく、スキップする数を増やしたらどうなるでしょうか? つまり、10 人を円に並べると、1、3、6、10 という順番で人が殺されました。変更は for ループで行われると思いますがi = i + 2、よくわかりません。

私は紙の上でそれを解決しました。これは削除の順序です。アスタリスクは削除する番号を示します。

0    *1*  2  3  4  5  6  7  8  9  10 
1     2  *3* 4  5  6  7  8  9  10
2     2   4  5 *6* 7  8  9  10
3     2   4  5  7  8  9 *10*
4     2   4  5  7 *8* 9
5     2   4  5  7 *9*
6     2   4 *5* 7
7    *2*  4  7
8    *4*  7
9     7 <-- Result   

考え?

編集: forループのこの変更を試しました:

for (int j = 2; j < chairArr.size() - 1; j++) {
    for (int i = 1; i < chairArr.size() - 1; i = i + j) {
        chairArr.add(chairArr.get(i));
        result = i;
    }
}

j = 2 の最初のパスの後、内側のループはすでにリストを 1 つの候補に絞り込んでいるため、外側のループが完了しないため、これは機能しません。

4

0 に答える 0