在约瑟夫斯增加跳跃

时间:2014-07-06 14:25:19

标签: java algorithm josephus

以下是约瑟夫斯问题的一个solution(人们被安排在一个圆圈中,其他每个人都被杀死,直到只留下一个人):

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的初始传递之后,内部循环已经将列表缩小到一个候选者,因此外部循环永远不会完成。

0 个答案:

没有答案