以下は、ヨセフス問題 (人々が円形に配置され、残りの 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 つの候補に絞り込んでいるため、外側のループが完了しないため、これは機能しません。