`

队列用例:Josephus问题

 
阅读更多
/**
 * 据说著名犹太历史学家 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


分享到:
评论

相关推荐

    数据结构上机报告(停车场管理模拟).rar_Josephus_停车场_停车场报告_停车场管理_停车场管理 报告

    《数据结构上机报告——基于Josephus问题的停车场管理模拟》 在计算机科学领域,数据结构是编程的基础,它涉及到如何高效地存储和组织数据,以便进行有效的计算和操作。本报告聚焦于一个具体的应用场景——停车场...

    约瑟夫问题-基于C++的约瑟夫问题的一种变种-题解.zip

    约瑟夫问题(Josephus Problem)是一个著名的理论问题,在计算机科学和算法设计中常被用作教学案例。问题源于古罗马历史,描述了一群人围成一个圈,按顺序报数,每次数到特定数值的人会被排除出圈,然后从下一个人...

    数据结构实验课件(2013年)zy.pdf

    3. **算法设计**:实验涉及多种算法,如Josephus问题的解决,需要理解和运用循环链表,同时处理奇偶轮转的情况。此外,还包括集合的并、交、差运算,多项式运算,复数和长整数的四则运算,这些都是基础算法的实践。 ...

    数据结构_约瑟夫环_课程设计.zip

    在数据结构的领域中,约瑟夫环(Josephus Problem)是一个著名的理论问题,它涉及到循环链表的构建和操作,是理解和实践链表、栈、队列等基本数据结构的良好实例。 约瑟夫环问题源自一个历史故事:在古代,一群犹太...

    数据结构课程设计 joseph环

    本次课程设计的主题是“约瑟夫环(Josephus Problem)”,这是一种基于数组或链表的数据结构问题,具有较高的理论研究价值和实际应用背景。 约瑟夫环源于一个古老的故事,讲述的是在战争中,被困的士兵们按照一定的...

    约瑟夫环 数据结构课设

    约瑟夫环(Josephus Problem)是一个著名的理论问题,源于公元前一世纪犹太历史学家约瑟夫·弗拉维乌斯的叙述。在数据结构的学习中,约瑟夫环常被用来探讨链表、栈、队列等数据结构的运用,以及循环移位和算法设计。...

    lab01 lab01lab01

    此问题涉及到对实时数据流的处理,主要利用哈希表、优先队列等数据结构来实现高效的数据查询与更新。 #### 解题思路 题目要求编写一个程序来跟踪来自股票市场的实时交易数据,并输出每天的统计数据。这些数据包括...

    数据结构(Java)约瑟夫环

    约瑟夫环(Josephus Problem)是一个经典的理论问题,它源自一个古老的传说,通常用来探讨生存策略。在这个问题中,人们围成一个圈,从某个人开始按顺序报数,数到特定数值的人会被排除,然后从下一个人继续报数,...

    CART-263-约瑟夫

    标题"CART-263-约瑟夫"和描述中提到的"CART-263-约瑟夫"可能指的是一个编程挑战或者项目,其中"约瑟夫问题"(Josephus Problem)是一个著名的理论问题,它涉及到算法和数学。在这个问题中,人们站成一个圈,并按照...

    数据结构专业课程设计方案报告约瑟夫环完整版.doc

    约瑟夫环(Josephus Problem)是数据结构领域中的一个经典问题,它源自一个假设的历史场景:人们按照一定的规则在环形队列中依次淘汰,直到只剩一人为止。这个问题可以用来考察数据结构和算法的设计与实现,特别是在...

Global site tag (gtag.js) - Google Analytics