约瑟夫问题的一个简单java实现

约瑟夫问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。

有n个囚犯站成一个圆圈,准备处决。首先从一个人开始,越过 k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过 k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。

问题是,给定了n和k,一开始要站在什么地方才能避免被处决?

这里不研究数学解法,用java模拟整个过程。

通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解,而ArrayList下标正好从0开始,代码如下:

public static void main(String[] args) {
    joseph(4, 2, 1);
}

/**
 * @param total 总人数
 * @param count 数到几出列
 * @param start 从谁开始
 */
public static void joseph(int total, int count, int start){
    
    ArrayList list = new ArrayList();
    for (int i = 1; i <= total; i++) {
        list.add("person-"+i);
    }
    
    int startIndex = start - 1;
    int countActual = count - 1;
    while(list.size() > 0) {
        startIndex = (startIndex + countActual) % list.size();
        
        System.out.println(list);
        System.out.println(list.get(startIndex));
        list.remove(startIndex);
    }
}

结果如下:


joseph.png

你可能感兴趣的:(约瑟夫问题的一个简单java实现)