Josephus问题--N个人通过循环报数决定存活者--基于数组的实现

在这个问题中,N个人决定通过以下方式减少生存的人数,直至只剩下最后一人。
他们围坐成一圈(位置记为0到N-1)并从第一个人开始从1报数,报到M的人会被杀死,然后从下一个存活的人又从1开始报数,直到最后一个人留下来。传说中Josephus找到了不会被杀死的位置。编写一个程序,从命令行接收N和M并打印出人们被kill的顺序,同时也找到了幸存者的位置。

方法一 数组解法

public class Josephus {
    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        int M = Integer.parseInt(args[1]);

        int[] people = new int[N];
        for (int i = 0; i < N; i++) {
            people[i]=i;
        }
        int dead = 0;//死亡人数标记
        int count = 1;//报数标记
        int index= 0;//数组下标标记
        boolean[] isKilled = new boolean[N];//是否被杀死标记,默认false

        //不断kill,直至死亡个数达到N-1
        while(dead<N-1) {
            if(count == M) {
                isKilled[index] = true;
                dead++;
                System.out.println(people[index]);//输出被杀死的人的坐标
                //从下一个存活者开始报数
                index = (index+1)%N;
                while (isKilled[index]){
                    index = (index+1)%N;
                }
                count = 1;
            }else {
                //正常报数
                index = (index+1)%N;
                if(!isKilled[index]) {
                    count=count+1;
                }
            }
        }
        //找到幸存者
        for (int i = 0; i < N; i++) {
            if(!isKilled[i])
                System.out.println(people[i]);
        }
    }
}

命令行键入java Josephus 7 2
得到 1 3 5 0 4 2 6

posted @ 2019-10-17 19:16  dwwzone  阅读(273)  评论(0编辑  收藏  举报