public class JosephProblem {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入约瑟夫斯问题的总人数n:");
int m = in.nextInt();
System.out.println("请输入约瑟夫斯问题的报数设定值n:");
int n = in.nextInt();
System.out.println("约瑟夫斯问题游戏开始:");
int[] result = playKillGame(m,n);
System.out.println("约瑟夫斯问题游戏结束,自杀顺序是:");
for(int i = 0;i < result.length;i++) {
System.out.print(result[i] + " ");
}
System.out.print("\n");
}
/**
* 约瑟夫问题
* 一堆人,围成一个圈,然后规定一个数N,然后依次报数,当报数到N,这个人自杀,其他人鼓掌!啪啪啪,
* 接着又从1开始报数,报到N又自杀…以此类推,直到死剩最后一个人,那么游戏结束!
* @param m 参数人数
* @param n 指定人死亡
*/
public static int[] playKillGame(int m, int n){
// 返回自杀结果
int[] result = new int[m];
//用于计算当前已经自杀的人数
int count = 0;
// 初始化 并给给每个人开始编号
Queue qu = new LinkedList();
for (int i = 0; i < m; i++){
qu.add(i+1);
}
// 开始报数
int start = 1;
// 最后一个人
int lastMan = 0;
while (qu.size() > 0) {
lastMan = qu.poll();
if (start % n == 0) {
System.out.println("【"+ lastMan + "】--killed!--");
// 记录自杀人的编号
result[count++] = lastMan;
qu.remove(lastMan);
start = 0;
} else {
qu.add(lastMan);
}
start++;
}
return result;
}