`

约瑟夫环问题

 
阅读更多

在一只热气球上有15个日本人和15个美国人,由于热气球超重,必须要跳下去15个人。按照商讨的规则,从第一个人开始数起,第九个人被选做要跳下的人,以此类推。最终热气球上只剩下15个美国人,试编写一段程序,打印出那15个日本人的位置。

  import java.io.*;

  public class Yuesefu2 {

  public static class Ren {

  private int weizhi;

  Ren next;

  public Ren() {

  }

  public Ren(int i) {

  weizhi = i;

  }

  }

  public static void main(String[] args) throws IOException {

  Ren a1 = new Ren(1);

  Ren list = new Ren();

  list = a1;

  for (int i = 2; i <= 30; i++) {

  Ren a = new Ren(i);

  list.next = a;

  list = list.next;

  }

  list.next = a1;

  for (int j = 1; j <= 15; j++) {

  for (int m = 1; m <= 8; m++) {

  list = list.next;

  }

  System.out.println("第" + list.next.weizhi + "个人是日本人");

  list.next = list.next.next;

  }

  }

  }

  问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始时任意给出一个报数上限值m,从第一个人开

  始顺时针方向自1起顺序报数,报到m时停止报数,抱m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报

  数;如此下去,直到所有人全部出列为止。要求用JAVA设计一个程序模拟此过程,并给出出列人的编号序列。

  测试数据:

  初始报数上限值m = 20

  n = 7,七个人的密码依次为3,1,7,2,4,8,4

  */

  import javax.swing.*;

  public class Yuesefu

  {

  public static void main(String[] args)

  {

  JOptionPane input =new JOptionPane();

  int n=Integer.parseInt(input.showInputDialog("请输入总人数:"));

  Ren a1=new Ren(1,Integer.parseInt(input.showInputDialog("请输入第1个人的密码")));

  Ren index=a1;// j 指向人

  for(int i=2;i<=n;i++)//初始化每个人

  {

  index.next=new Ren(i,Integer.parseInt(input.showInputDialog("请输入第"+i+"个人的密码")));

  index=index.next;

  }

  index.next=a1;

  int m=Integer.parseInt(input.showInputDialog("请输入初始密码:"));

  for(int i=0;i<7;i++)

  {

  for(int k=0;k<m-1;k++)//轮转

  {

  index=index.next;

  }

  System.out.println("第"+index.next.flag+"个人出局");

  input.showMessageDialog(null,"第"+index.next.flag+"个人出局");

  m=index.next.mima;//可以实现剔除后转换为此人拥有的密码.

  index.next=index.next.next;

  }

  }

  public static class Ren//定义人的链表

  {

  private int flag;//序号

  private Ren next;//指针

  private int mima;

  public Ren(int n,int m)

  {

  flag=n;

  mima=m;

  }

  }

  }

着名的算法问题,约瑟夫环的c语言实现是利用了指针链表的形式,java实现呢,我的这个是用了内部类.

  算法描述:n个人围成一圈,每人有一个各不相同的编号,选择一个人作为起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈子缩小,然后从下一个人继续从1到k数数,重复上面过程。求最后推出圈子的那个人原来的编号。

  程序实现:

  public class JosephCircle {

  private class Node {

  public Node nextnode;

  public boolean flag;

  }

  private Node[] list;

  public JosephCircle() {

  list = new Node[30];

  int i;

  for (i = 0; i < 30; i++) {

  Node node = new Node();

  node.flag = true;

  if (i > 0) {

  list[i - 1].nextnode = node;

  }

  list[i] = node;

  }

  list[i - 1].nextnode = list[0];

  }

  public void start() {

  Node node = list[29];

  for (int i = 0; i < 135; i++) {

  if ((i+1) % 8 == 0) {

  node.flag = false;

  node.nextnode = node.nextnode.nextnode;

  } else {

  node = node.nextnode;

  }

  }

  }

  public void print() {

  Node node = list[29];

  for (int i = 0; i < 30; i++) {

  if (node.flag) {

  System.out.print("#");

  } else {

  System.out.print("@");

  }

  node = node.nextnode;

  }

  }

  public static void main(String[] args) {

  JosephCircle jc = new JosephCircle();

  jc.start();

  jc.print();

  }

  }

  ublic static void main(String args[]) {

  List<Integer> a = new ArrayList<Integer>();

  for (int i = 1; i <= 500; i++) {

  a.add(i);// 把每个小朋友的号码依次放入.

  }

  int num=0,currentIndex=0;

  while (a.size() > 1) {

  num++;

  if(num==3){

  a.remove(currentIndex);

  currentIndex--;

  num=0;

  }

  currentIndex++;

  if(currentIndex>=a.size())

  currentIndex=0;

  }

  System.out.println("最后一个小朋友的号码是: " + a.get(0));

  }

  import java.util.Scanner;

  /**

  *使用数组实现约瑟夫环问题

  *由m个人围成一个首尾相连的圈报数。

  *从第一个人开始,从1开始报数,报到n的人出圈,

  *剩下的人继续从1开始报数,直到所有的人都出圈为止。

  *对于给定的m和n,求出所有人的出圈顺序.

  */

  public class RingTest{

  public static void main(String[] args){

  System.out.println("程序说明如下:");

  System.out.println("由m个人围成一个首尾相连的圈报数。从第一个人开始,从1开始报数,报到n的人出圈,剩下的人继续从1开始报数,直到所有的人都出圈为止。对于给定的m和n,求出所有人的出圈顺序.");

  //提示输入总人数

  System.out.println("请输入做这个游戏的总人数:");

  Scanner sca=new Scanner(System.in);

  int m=sca.nextInt();

  //提示输入要出圈的数值

  System.out.println("请输入要出圈的数值:");

  int n=sca.nextInt();

  System.out.println("按出圈的次序输出序号:");

  //创建有m个值的数组

  int[] a=new int[m];

  //初始长度,以后出圈一个,长度就减一

  int len=m;

  //给数组赋值

  for(int i=0;i<a.length;i++)

  a[i]=i+1;

  //i为元素下表,j代表当前要报的数

  int i=0;

  int j=1;

  while(len>0){

  if(a[i%m]>0){

  if(j%n==0){//找到要出圈的人,并把圈中人数减一

  System.out.print(a[i%m]+"  ");

  a[i%m]=-1;

  j=1;

  i++;

  len--;

  }else{

  i++;

  j++;

  }

  }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数

  i++;

  }

  }

  }

  }

分享到:
评论

相关推荐

    循环队列和约瑟夫环问题

    循环队列和约瑟夫环问题 循环队列是一种特殊的队列结构,它的特点是队列的末尾元素连接着队列的开头元素,形成一个环形结构。这种数据结构可以用来解决约瑟夫环问题。 约瑟夫环问题是一个经典的问题,它是由古罗马...

    敢死队问题课程设计(约瑟夫环问题的应用)

    【敢死队问题(约瑟夫环问题的应用)】是一个经典的计算机科学问题,它涉及到数据结构和算法的设计。在这个问题中,M个敢死队员通过循环计数的方式决定执行任务的顺序,每数到5的人将执行任务并退出,直至只剩下一个...

    用循环链表实现约瑟夫环问题

    使用c语言中的循环链表及结构体实现约瑟夫环问题

    数据结构约瑟夫环问题

    数据结构中的约瑟夫环问题是一种经典的编程问题,它涉及到链表这一数据结构的应用。在本文中,我们将深入探讨约瑟夫环问题的背景、原理以及如何使用链表来求解这一问题,同时分析给定代码的具体实现细节。 ### ...

    约瑟夫环问题算法描述和程序实现(C#)

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们围成一个圈,并按照一定的规则依次淘汰,最后留下来的人被称为“幸存者”。具体规则是:从...

    约瑟夫环问题用C++代码实现

    约瑟夫环问题,也称为约瑟夫问题,是一个经典的理论问题,源于古罗马时期的传说。问题描述了一群人围坐成一个圆圈,按照一定的规则进行报数,每数到特定数字的人会被排除,直到所有人都被排除。在这个场景中,我们...

    c++多种方法解决约瑟夫环问题

    多种方法解决约瑟夫环问题,1.顺序表2.循环链表3.循环队列4.普通一位数组

    约瑟夫环问题(C++)

    约瑟夫环问题,也被称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史上的一个故事。在这个问题中,人们站成一个圈,并按顺时针方向编号。从某个人开始,每隔特定的人数,这个人就会被排除出圈,...

    详细介绍约瑟夫环问题解析.docx

    约瑟夫环问题解析 约瑟夫环问题是计算机科学和数学中一个著名的问题,它是指在一个圆圈中的人按照一定的规则依次出列的问题。该问题的解析报告将从以下几个方面进行讲解: 一、问题描述 约瑟夫环问题可以用以下...

    约瑟夫环问题的编程实现

    约瑟夫环问题,也称为约瑟夫环序列或约瑟夫问题,是一个著名的理论问题,源自古罗马历史的一个故事。在数学和计算机科学中,它通常被用来演示各种算法,特别是循环移位和递归算法。这个问题描述如下:假设有一群人围...

    用C语言实现约瑟夫环问题

    《C语言实现约瑟夫环问题详解》 约瑟夫环问题,又称约瑟夫环序列,是一个著名的理论问题,源自古罗马的一个传说。在这个问题中,人们围成一个圈,按照一定的规则逐个淘汰,直到剩下最后一个人为止。这个问题在...

    约瑟夫环问题用循环队列解决

    用循环队列解决约瑟夫环问题减少用顺序表在出对是循环移动带来的空间复杂度

    1模拟轮盘抽奖游戏2模拟报数游戏(约瑟夫环问题)_抽奖轮盘_模拟报数游戏_模拟轮盘抽奖游戏_游戏_用python实现_

    在本项目中,我们将探讨如何使用Python编程语言来实现两种有趣的数学和计算机科学相关的游戏:模拟轮盘抽奖游戏和模拟报数游戏,也称为约瑟夫环问题。这两个游戏不仅有趣,而且能帮助我们理解循环、列表操作以及算法...

    约瑟夫环问题,C语言编写

    数据结构中的约瑟夫环问题 C语言编写,已经测试通过

    约瑟夫环问题的源代码(c++)

    约瑟夫环问题的源代码分析 约瑟夫环问题是计算机科学中的一种经典问题,描述的是10个小孩围坐在一圈,并给他们依次编号,指定从第s个小孩开始报数(从1~n报数),报到n的小孩出列,然后依次重复下去,直到所有的...

    C语言编写的关于约瑟夫环问题的程序

    标题中的“C语言编写的关于约瑟夫环问题的程序”指的是使用C编程语言实现的一个经典算法问题——约瑟夫环(Josephus Problem)。约瑟夫环问题是一个理论上的问题,通常在计算机科学和数学中被用作示例,以讨论和解决...

    数据结构实验报告--约瑟夫环问题

    实验报告的主题是“约瑟夫环问题”,这是一个经典的数据结构问题,源于数学家约瑟夫·弗朗西斯·里斯提出的假设情景。该问题描述了一群人围成一个圈,从某个人开始按顺时针方向依次报数,每当数到特定数值的人会被...

Global site tag (gtag.js) - Google Analytics