/**

* 作者:徐守威

* 功能:约瑟夫问题(丢手帕问题)

* 具体问题:设编号为1,2,3....n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始

* 报数,数到m的那个人出列,它的下一位从一开始报数,报到m的那个人又出列,以此类推,

* 直到所有人出列为止,如此产生一个出列编号的序列...

* 解决方案:链表

*/

package com.jasxu;

import java.io.*;

public class T4 {

/**

* @param args

*/

public static void main(String[] args){

// TODO Auto-generated method stub

try

{

InputStreamReader isr=new InputStreamReader(System.in);

BufferedReader br=new BufferedReader(isr);

System.out.println("请输入参加该游戏小孩的个数:");

String joinNmu=br.readLine();

System.out.println("请输入您想从编号为几的小孩开始报数?");

String n1=br.readLine();

System.out.println("请输入您想数到几的小孩出列?");

String n2=br.readLine();

int num1=Integer.parseInt(n1);

int num2=Integer.parseInt(n2);

int joinLen=Integer.parseInt(joinNmu);

CycLink cyclink=new CycLink();

cyclink.setLen(joinLen);

cyclink.createLink();

cyclink.setK(num2);

cyclink.setM(2);

cyclink.show();

cyclink.play();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

//构建各个孩子

class Child

{

//定义child的编号

int no;

//定义可以指向下一个的指针

Child nextChild=null;

//创建构造函数

public Child(int no)

{

//赋编号

this.no=no;

}

}

//构建一个环形链表

class CycLink

{

//先定义一个指向链表第一个小孩的引用

//指向第一个小孩的引用,不能动

Child firstChild=null;

//定义一个游标,相当于跑龙套

Child temp=null;

//定义一个表示大小的的len,表示共有几个小孩

int len=0;

int k=0;

int m=0;

//构造函数,用来设置环形链表的大小

public void setLen(int len)

{

this.len=len;

}

//设置m的值

public void setM(int m)

{

this.m=m;

}

//设置从第几个人开始数数

public void setK(int k)

{

this.k=k;

}

//游戏实现

public void play()

{

//设置跑龙套的小孩

Child temp=this.firstChild;

//1.找到开始数数的人

for(int i=1;i<k;i++)

{

temp=temp.nextChild;

}

while(this.len!=1)

{

//2.数m下

for(int j=1;j<m;j++)

{

temp=temp.nextChild;

}

//3.找到要出圈的前一个小孩

//定义一个2号跑龙套的人

Child temp2=temp;

while(temp2.nextChild!=temp)

{

temp2=temp2.nextChild;

}

//4.数完了过后将数到m的小孩退出圈

temp2.nextChild=temp.nextChild;

//让temp指向下一个数数的小孩

temp=temp.nextChild;

this.len--;

}

//输出最后一个小孩

System.out.println("最后出圈的小孩是:"+temp.no+"号小孩!");

}

//初始化环形链表

public void createLink()

{

//统计有多少个孩子

for(int i=1;i<=len;i++)

{

if(i==1)

{

//首先创建第一个小孩

Child ch=new Child(i);

//将第一个孩子的应用交给firstChild

this.firstChild=ch;

//同时也要将引用交给跑龙套用

this.temp=ch;

}

else

{

//判断是否是创建最后一个小孩

if(i==len)

{

//继续创建小孩

Child ch=new Child(i);

//将temp的指针指向下一条地址的引用

temp.nextChild=ch;//这条线相当于搭桥的线

//桥答完后还要让temp指向刚刚创建的那个孩子

temp=ch;

//最后一个小孩的指针应指向头一个地址的引用

temp.nextChild=this.firstChild;

}

else

{

//继续创建小孩

Child ch=new Child(i);

//将temp的指针指向下一条地址的引用

temp.nextChild=ch;//这条线相当于搭桥的线

//桥答完后还要让temp指向刚刚创建的那个孩子

temp=ch;

}

}

}

}

//打印该环形链表

public void show()

{

//定义一个跑龙套

Child temp=this.firstChild;

do

{

System.out.print(temp.no+" ");

temp=temp.nextChild;

}while(temp!=this.firstChild);

}

}

转载于:https://www.cnblogs.com/Jasxu/p/3529753.html

约瑟夫问题(丢手帕问题)相关推荐

  1. 约瑟夫问题,即丢手帕游戏

    /** @author sunqian @time 2015.1.27 @功能 约瑟夫(丢手帕)问题 @描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空, ...

  2. 丢手帕问题(约瑟夫问题)

    设编号为1,2,n的n个人围坐一圈,约定编号为K(1=<K<=n)的人从1开始报数,数到m的人出列,她的下一位又从1开始报数,数到m的人又出列,以此类推直到所有人都出列,由此产生一个出队序 ...

  3. 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏

    /** @author sunqian @time 2015.1.27 @功能 约瑟夫(丢手帕)问题 @描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空, ...

  4. 约瑟夫问题的理解与解决(丢手帕问题)

    又到了面试题的总结手机,下面让我们来看看如何理解与求解约瑟夫问题吧! 什么是约瑟夫问题? 简单来讲(小编个人理解):一堆人想要选择一个人来做事情(需要多个人),就选择一个数,排序到这个数的人去做这件事 ...

  5. 丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例

    本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解这一问题. ...

  6. 丢手帕问题 java_丢手帕问题,java实现

    今天偶然发现一个很经典的算法问题:丢手帕问题.问题的具体描述是:N个人围成一圈,然后从第A个人开始报数(报数从1开始).报数为B的人出列,然后后面的人从新开始报数,请问,最后一个人是多少号. 刚开始觉 ...

  7. 丢手帕问题 java_java基于双向环形链表解决丢手帕问题的方法示例

    导读热词 本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解 ...

  8. 丢手帕问题 java_丢手帕问题 (java实现)

    /** *@author zhouhong *@fuction:丢手帕问题 */ package com.zhouhong10; import com.zhouhong10.*; public cla ...

  9. 约瑟夫问题(丢手帕问题)的java实现

    约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3.最后剩下1号.借用一些自己感兴趣的球星的名字,使 ...

最新文章

  1. 软件性能测试主要看什么指标
  2. 当Swin Transformer遇上DCN,效果惊人!
  3. 1501 二叉树最大宽度和高度
  4. MySql 内存表使用
  5. java版苹果免签源码超级签名免签源码
  6. jquery easyui Tab 引入页面的问题
  7. Silverlight Blend动画设计系列三:缩放动画(ScaleTransform)
  8. Javascript中最常用的经典技巧
  9. php生成透明png图像 无锯齿
  10. Python 过滤a文件中每一行内容,保存到b文件中
  11. 微信小程序 js 正则校验车牌号 车牌号校验
  12. IPFS是创建DWeb应用程序中基础技术的领先者
  13. P1137【旅行计划】
  14. java word 图片_java导出word(带图片)
  15. 融云首席科学家任杰:写在融云 8 周年
  16. 幼儿园计算机认识键盘上课教案,认识键盘教案
  17. 为什么这么多学生讨厌数学(以及如何解决它)?
  18. 在线文字生成音频工具
  19. 计算机职业资格证书的权威部门是哪个部门?
  20. 巴菲特50年投资之道

热门文章

  1. 遗传算法的收敛性分析
  2. 梯度下降原理及在线性回归、逻辑回归中的应用
  3. Manacher's algorithms(马拉车算法)最长回文子串
  4. 爬取广州所有停车场数据(Python)
  5. sklearn中的fit_transform和transform以及什么时候使用
  6. Python代码:数字图像处理(DIP)7.1.2子带编码example7.2
  7. Spring @Autowired 注入为 null
  8. odata连接现有数据库
  9. kubernetes 1.7.2 安装 记录过程
  10. ORACLE 导空表结构