`

约瑟夫

阅读更多

约瑟夫出圈问题 两种方法实现,数据和链表 n个人围成一个圈,一个个首尾相连的圈报数,从第一个开始报数
 报到m的人出圈,剩下的人继续从1开始报数,直到所有人都出圈为止。

  1. import java.util.LinkedList;   
  2. import java.util.Scanner;   
  3.   
  4. /**  
  5.  * 约瑟夫出圈问题 两种方法实现,数据和链表 n个人围成一个圈,一个个首尾相连的圈报数,从第一个开始报数  
  6.  * 报到m的人出圈,剩下的人继续从1开始报数,直到所有人都出圈为止。  
  7.  *   
  8.  * @author sesame.yangj  
  9.  */  
  10. public class Joseph {   
  11.   
  12.     /**  
  13.      * @param args  
  14.      */  
  15.     public static void main(String[] args) {   
  16.         Joseph j = new Joseph();   
  17.         System.out.println("约瑟夫出圈");   
  18.         System.out.println("输入人数:");   
  19.         Scanner s = new Scanner(System.in);   
  20.         int n = s.nextInt();   
  21.         System.out.println("输入出圈的位置:");   
  22.         int m = s.nextInt();   
  23.         System.out.println("数组实现");   
  24.         j.arrayJoseph(n, m);   
  25.         System.out.println("链表实现");   
  26.         j.listJoseph(n, m);   
  27.     }   
  28.   
  29.     /**  
  30.      * 用数组实现  
  31.      *   
  32.      * @param n 总的人数  
  33.      * @param m 当前报的数  
  34.      */  
  35.     public void arrayJoseph(int n, int m) {   
  36.         //数组存储编号   
  37.         int array[] = new int[n];   
  38.         int len = n;   
  39.         for (int i = 0; i < array.length; i++) {   
  40.             array[i] = i + 1;   
  41.         }   
  42.   
  43.         int i = 0;   
  44.         //当前报的数   
  45.         int j = 1;   
  46.   
  47.         while (len > 0) {   
  48.             if (array[i % n] > 0) {   
  49.                 //位置有人   
  50.                 if (j % m == 0) {   
  51.                     //报到出圈的人   
  52.                     System.out.println(array[i % n]);   
  53.                     //为之置空   
  54.                     array[i % n] = -1;   
  55.                     //从1开始报数   
  56.                     j = 1;   
  57.                     i++;   
  58.                     len--;   
  59.                 } else {   
  60.                     i++;   
  61.                     j++;   
  62.                 }   
  63.             } else {   
  64.                 //遇到空位   
  65.                 i++;   
  66.             }   
  67.         }   
  68.     }   
  69.   
  70.     /**  
  71.      * 用双向链表实现  
  72.      *   
  73.      * @param n  
  74.      * @param m  
  75.      */  
  76.     public void listJoseph(int n, int m) {   
  77.         LinkedList<Integer> list = new LinkedList<Integer>();   
  78.         for (int i = 0; i < n; i++) {   
  79.             //添加数据,与编号对应   
  80.             list.add(i + 1);   
  81.         }   
  82.         int moved = 0;   
  83.         while (list.size() > 0) {   
  84.             moved = (moved + m - 1) % list.size();   
  85.             System.out.println(list.get(moved));   
  86.             list.remove(moved);   
  87.         }   
  88.     }   
  89. }  

 

  1. public class Joseph {   
  2.   
  3.     /**  
  4.      * 问题描述  
  5.      * 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号  
  6.      * 开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,  
  7.      * 直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。  
  8.      * 输入数据  
  9.      * 每行是用空格分开的两个整数,第一个是 n ,第二个是 m ( 0 < m, n < 300),最后一行是:0 0   
  10.      * 输出要求  
  11.      * 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号  
  12.      * 输入样例:  
  13.      * 6 2  
  14.      * 12 4  
  15.      * 8 3  
  16.      * 0 0  
  17.      * 输出样例:  
  18.      * 5  
  19.      * 1  
  20.      * 7  
  21.      */  
  22.     public static void main(String[] args) {   
  23.   
  24.         Scanner in =new Scanner(System.in);    
  25.         System.out.print("有几只猴子选大王?");    
  26.         int amount = in.nextInt();   
  27.         System.out.print("喊几的退出圈子?");    
  28.         int num = in.nextInt();   
  29.   
  30.         // 定义"猴子圈"   
  31.         Set<Integer> monkeys = new TreeSet<Integer>();   
  32.         // 初始化"猴子圈",确定每只猴子的编号。   
  33.         for (int i = 1; i <= amount; i++) {   
  34.             monkeys.add(i);   
  35.         }   
  36.            
  37.         // 初始化报的数为1   
  38.         int i = 1;   
  39.         // 开始报数! 每一轮报数,都接着上次报的数i进行,"猴子圈"只剩1只猴子了就停止报数   
  40.         while (monkeys.size() > 1) {   
  41.             // 定义猴子编号数组,用于迭代"猴子圈"   
  42.             Integer[] monkeyNums = monkeys.toArray(new Integer[0]);   
  43.             // 迭代"猴子圈",作为一轮报数   
  44.             for (int monkeyNum : monkeyNums) {   
  45.                 if (i < num) {   
  46.                     // 下只猴子要报的数   
  47.                     i++;   
  48.                 } else {   
  49.                     // 如果这只猴子报的数是num,就把它移出"猴子圈"   
  50.                     monkeys.remove(monkeyNum);   
  51.                     // 下只猴子报数从1开始   
  52.                     i = 1;   
  53.                 }   
  54.             }   
  55.         }   
  56.            
  57.         // "猴子圈"的最后一只猴子做大王。   
  58.         int king = 0;   
  59.         for (int monkeyNum : monkeys) {   
  60.             king = monkeyNum;   
  61.         }   
  62.            
  63.         System.out.println("大王是" + king + "号猴子");   
  64.     }   
  65.   
  66. }  
分享到:
评论

相关推荐

    约瑟夫环实验报告

    从给定的文件信息来看,主要的信息点集中在标题和描述中,即“约瑟夫环实验报告”以及“用vc6.0环境实现的约瑟夫环的上机实验报告”。这部分信息涉及到计算机科学中的一个重要数据结构问题——约瑟夫环(Josephus ...

    约瑟夫环约瑟夫环约瑟夫环约瑟夫环约瑟夫环

    约瑟夫环(Josephus Problem)是一个著名的理论问题,源于古罗马时代的一种假设情景。问题的基本设置是:人们围成一个圈,从某个人开始按照顺时针或逆时针顺序报数,每次数到特定数值的人会被排除出圈,然后从下一个...

    基于mfc的约瑟夫环模拟器

    【约瑟夫环模拟器基于MFC的实现】 约瑟夫环问题,源自古罗马的一则历史传说,是一个经典的计算机科学问题,它涉及到循环链表和递归算法。在这个问题中,人们围成一个圈,从某个人开始按顺序报数,每次数到特定数字...

    约瑟夫环的mfc实例

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古希腊的数学家约瑟夫·弗拉基米尔。这个问题的基本设定是:一个圆圈中的n个人按顺序编号,从第一个人开始报数,数到m的人将被剔除,然后...

    数据结构约瑟夫环实习报告

    约瑟夫环(Josephus Problem)是一个经典的理论问题,它在数据结构和算法的教学中常被用作实例,来展示链表、队列、栈等数据结构的应用。这个实习报告将深入探讨这个问题,并通过源代码进行实际实现。 约瑟夫环问题...

    约瑟夫环问题算法

    约瑟夫环问题,也被称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马的传说。该问题的基本设定是:一群囚犯围成一个圈,按照顺时针方向从某个人开始计数,每数到特定数值的人会被剔除出圈,然后从下...

    约瑟夫环代码及实验!!

    约瑟夫环问题是一个经典的计算机科学问题,源自一个古老的故事。在这个问题中,人们围成一个圈,并按顺序编号。每次从某个特定编号的人开始,每隔一定数量的人就会被排除,直到只剩下最后一个人为止。这个问题通常...

    数据结构 约瑟夫问题

    用循环单向链表解决约瑟夫问题 原题: 设有n个人站成一圈,每个人持有一个密码(正整数)。现从第t个人开始,按顺时针方向“1,2,3,4,…”循环报数,数到m1(第t个人所持密码)的人出列,然后从出列者的下一个人重新...

    数据结构 约瑟夫生死游戏

    约瑟夫生死游戏算法实现 数据结构中的约瑟夫生死游戏是一种经典的算法问题,旨在解决在某个圆环中,每个人的生死次序问题。该问题的解决方案主要基于单循环链表的数据结构和算法实现。 约瑟夫生死游戏的算法思想 ...

    约瑟夫生死游戏队列实现

    约瑟夫生死游戏,也被称为约瑟夫环问题(Josephus Problem),是计算机科学和算法设计中的一个经典问题。这个游戏源自一个古老的传说,涉及到在战争中被捕的士兵们站成一个圈,按照一定的规则每间隔一定人数淘汰一人...

    数据结构课程设计约瑟夫生死游戏

    "数据结构课程设计约瑟夫生死游戏" 本课程设计的标题是“数据结构课程设计约瑟夫生死游戏”,是数据结构课程设计的一部分,旨在训练学生的数据组织能力和提高程序设计能力。该设计的目的是学习数据结构课程,学会...

    约瑟夫环代码约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。

    ### 约瑟夫环(Josephus)问题详解与实现 #### 一、问题背景及定义 约瑟夫环问题源自古罗马时期的历史事件。据史学家约瑟夫记载,在公元66年至70年间,犹太人反抗罗马统治期间,约瑟夫和他的40名部下在裘达伯特城...

    约瑟夫环(链表实现)

    "约瑟夫环(链表实现)" 约瑟夫环是一种经典的算法问题,它的主要思想是使用链表来模拟一个环形结构,然后通过遍历这个环形结构来实现约瑟夫环的操作。下面我们将详细介绍约瑟夫环的链表实现。 首先,我们需要定义...

    Josephus 约瑟夫问题(POJ)

    《约瑟夫问题详解及其在POJ中的应用》 约瑟夫问题,源自古罗马历史的一个有趣的故事,是由数学家约瑟夫·弗拉基米尔提出的。问题的基本设定是:一群人站成一个圆圈,从某人开始按顺时针方向计数,每数到特定数值的...

    vc编写的约瑟夫环实验报告

    《VC实现约瑟夫环:链式与顺序表解析》 约瑟夫环问题,源自古罗马的一个传说,是一个经典的计算机科学问题。在VC++环境下,我们可以通过编程来解决这个问题,既可以采用链式存储结构,也可以使用顺序存储结构。本...

    约瑟夫环代码约瑟夫环代码约瑟夫环代码

    约瑟夫环问题,也称为约瑟夫环算法(Josephus Problem),是一个著名的理论问题,源于公元前一世纪犹太历史学家约瑟夫·弗拉基米尔的叙述。在这个问题中,人们围成一个圈,从某个人开始按顺序报数,每次数到特定数值...

    约瑟夫环c++语言编程

    根据给定的文件信息,我们可以总结出以下关于“约瑟夫环C++语言编程”的相关知识点: ### 一、约瑟夫环问题介绍 约瑟夫环(Josephus Problem)是一个经典的理论计算机科学问题,源自古罗马时期的数学家约瑟夫斯·...

    约瑟夫环代码 c语言约瑟夫

    ### 约瑟夫环问题及其C语言实现 #### 一、约瑟夫环问题概述 约瑟夫环(Josephus Problem)是一个经典的数学问题,它涉及到一系列人在一个圈中根据特定规则依次“出列”的过程。具体描述如下: 1. **初始条件**:...

    约瑟夫环数据结构实验报告.doc

    【约瑟夫环数据结构实验】是数据结构课程中一个经典的问题,主要涉及线性表的存储结构——单向循环链表。实验的目标是模拟约瑟夫环问题,即若干人围成一圈按顺时针方向报数,报到特定数字的人出列,然后下一轮重新...

    数据结构--约瑟夫环算法描述

    约瑟夫环(Josephus Problem)是一个著名的理论问题,源于公元前一世纪的犹太历史学家约瑟夫·弗拉维乌斯所描述的故事。在该问题中,人们站成一个圈,从某个人开始计数,每数到特定数字的人会被排除出圈,然后继续从...

Global site tag (gtag.js) - Google Analytics