import java.util.LinkedList;
import java.util.Queue;
/**
* 约瑟夫环求解类
*
* 问题描述:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,
* 39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆
* 圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直
* 到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友
* 先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
*
* 使用dataNum和killNum初始Josephus对象,然后调用getAlife()方法获取求解结果。
* dataNum是一个int类型,表示参与人数
* killNum是一个int类型,表示自杀时所报的数字
* getAlife()返回一个int[]类型,存放最终存活的位置
*
* 例如:dataNum = 41, killNum = 3, 则getAlife() = {16, 31}
*
* @author max
*
*/
public class Josephus {
private Queue<Integer> queue;
private int dataNum;
private int killNum;
private int[] alife;
public Josephus(int dataNum, int killNum) {
this.dataNum = dataNum;
this.killNum = killNum;
initialQueue();
handle();
}
private void initialQueue() {
queue = new LinkedList<Integer>();
for (int i=0; i < dataNum; i++) {
queue.offer(i+1);
}
}
private void handle() {
int i = 0;
while (queue.size() >= killNum) {
if (++i % killNum == 0) {
queue.poll();
} else {
queue.offer(queue.poll());
}
}
i = 0;
alife = new int[killNum - 1];
while(!queue.isEmpty()) {
alife[i++] = queue.poll();
}
}
/**
* 获取最终存活位置的数组
* @return int[] 存放最终存活位置的数组
*/
public int[] getAlife() {
return alife;
}
}
约瑟夫环问题求解(Java代码)
最新推荐文章于 2024-07-03 02:15:52 发布