/**
* 据说著名犹太历史学家 Josephus有过以下的故事:
* 在罗马人占领乔塔帕特後,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,
* 于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,
* 直到所有人都自杀身亡为止。
* 然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,
* 于是逃过了这场死亡游戏。
*
*/
public class JosephusProblem {
static int N = 41;
public static void main(String[] args) {
int M = 3;//数到第N个时自杀
Queue<Integer>q1 = new LinkQueue<Integer>();
for(int i = 0;i<N;i++){
q1.push(i+1);
}
kill(q1,M,0,1);
}
/**
* @param q 队列
* @param n 数到第N个时自杀
* @param i 本论自杀数数完毕之后数到了第几
* @param level 第几轮
*/
public static void kill(Queue<Integer> q,int n,int i,int level){
formatPrintln(q);
if(q.isEmpty() || q.size()==1){
if(q.size()==1){
System.out.println("survivor:"+q.pop());
}
return;
}
Queue<Integer> survivors = new LinkQueue<Integer>();
int peopleIndex = 0;
while(!q.isEmpty()){
peopleIndex = q.pop();
i++;//报数
if(i==n){
formatPrint("^");
i = 0;
}else{
survivors.push(peopleIndex);
formatPrint();
}
}
System.out.println();
for(int x = 0;x<N;x++){
System.out.print("-----");
}
System.out.println();
kill(survivors,n,i,++level);
}
private static void formatPrintln(Queue<Integer> q){
for(Integer i : q){
System.out.print(fullBlank(i+""));
}
System.out.println();
}
private static void formatPrint(String str){
System.out.print(fullBlank(str));
}
private static void formatPrint(){
System.out.print(fullBlank(""));
}
private static String fullBlank(String str){
if(str.length()<5){
str = str+ (" ".substring(0,5-str.length()));
}
return str;
}
}
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 2 4 5 7 8 10 11 13 14 16 17 19 20 22 23 25 26 28 29 31 32 34 35 37 38 40 41
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 4 7 8 11 13 16 17 20 22 25 26 29 31 34 35 38 40
^ ^ ^ ^ ^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 4 8 11 16 17 22 25 29 31 35 38
^ ^ ^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 4 11 16 22 25 31 35
^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 4 16 22 31 35
^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4 16 31 35
^ ^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 31
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
16 31
^
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
31
survivor:31
分享到:
相关推荐
《数据结构上机报告——基于Josephus问题的停车场管理模拟》 在计算机科学领域,数据结构是编程的基础,它涉及到如何高效地存储和组织数据,以便进行有效的计算和操作。本报告聚焦于一个具体的应用场景——停车场...
约瑟夫问题(Josephus Problem)是一个著名的理论问题,在计算机科学和算法设计中常被用作教学案例。问题源于古罗马历史,描述了一群人围成一个圈,按顺序报数,每次数到特定数值的人会被排除出圈,然后从下一个人...
3. **算法设计**:实验涉及多种算法,如Josephus问题的解决,需要理解和运用循环链表,同时处理奇偶轮转的情况。此外,还包括集合的并、交、差运算,多项式运算,复数和长整数的四则运算,这些都是基础算法的实践。 ...
在数据结构的领域中,约瑟夫环(Josephus Problem)是一个著名的理论问题,它涉及到循环链表的构建和操作,是理解和实践链表、栈、队列等基本数据结构的良好实例。 约瑟夫环问题源自一个历史故事:在古代,一群犹太...
本次课程设计的主题是“约瑟夫环(Josephus Problem)”,这是一种基于数组或链表的数据结构问题,具有较高的理论研究价值和实际应用背景。 约瑟夫环源于一个古老的故事,讲述的是在战争中,被困的士兵们按照一定的...
约瑟夫环(Josephus Problem)是一个著名的理论问题,源于公元前一世纪犹太历史学家约瑟夫·弗拉维乌斯的叙述。在数据结构的学习中,约瑟夫环常被用来探讨链表、栈、队列等数据结构的运用,以及循环移位和算法设计。...
此问题涉及到对实时数据流的处理,主要利用哈希表、优先队列等数据结构来实现高效的数据查询与更新。 #### 解题思路 题目要求编写一个程序来跟踪来自股票市场的实时交易数据,并输出每天的统计数据。这些数据包括...
约瑟夫环(Josephus Problem)是一个经典的理论问题,它源自一个古老的传说,通常用来探讨生存策略。在这个问题中,人们围成一个圈,从某个人开始按顺序报数,数到特定数值的人会被排除,然后从下一个人继续报数,...
标题"CART-263-约瑟夫"和描述中提到的"CART-263-约瑟夫"可能指的是一个编程挑战或者项目,其中"约瑟夫问题"(Josephus Problem)是一个著名的理论问题,它涉及到算法和数学。在这个问题中,人们站成一个圈,并按照...
约瑟夫环(Josephus Problem)是数据结构领域中的一个经典问题,它源自一个假设的历史场景:人们按照一定的规则在环形队列中依次淘汰,直到只剩一人为止。这个问题可以用来考察数据结构和算法的设计与实现,特别是在...