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