Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。例如当n = 8, m =4, k =3时,出列的顺序依次为6, 2, 7, 4, 3, 5, 1, 8。

解题:用一个不带头结点的循环链表来处理Josephu问题,先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点的人从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。

  1. //使用单向链表
  2. public class Demo121 {
  3. public static void main(String[] args) {
  4. CycLink cyclink=new CycLink();
  5. cyclink.setLen(5);//链表长度
  6. cyclink.createLink();
  7. cyclink.setK(2);//从第几个人开始数
  8. cyclink.setM(2);//数几下
  9. cyclink.show();
  10. cyclink.play();
  11. }
  12. }
  13.  
  14. class Child{
  15. int no;
  16. Child nextChild=null;
  17. public Child(int no){
  18. //给一个编号
  19. this.no=no;
  20. }
  21. }
  22.  
  23. //单向环形链表
  24. class CycLink{
  25. //先定义一个指向链表第一个小孩的引用
  26. //指向第一个小孩的引用,不能动
  27. Child firstChild=null;
  28. Child temp=null;
  29. int len=0;//表示共有多少个小孩
  30. int k=0;
  31. int m=0;
  32. //设置m数几下
  33. public void setM(int m){
  34. this.m=m;
  35. }
  36. //设置环形链表大小
  37. public void setLen(int len){
  38. this.len=len;
  39. }
  40. //设置从第几个人开始数数
  41. public void setK(int k){
  42. this.k=k;
  43. }
  44. //开始play
  45. public void play(){
  46. Child temp=this.firstChild;
  47. //1.先找到开始数数的人
  48. for(int i=1;i<k;i++){
  49. temp=temp.nextChild;
  50. }
  51. while(this.len!=1){
  52. //2.数m下
  53. for(int j=1;j<m;j++){
  54. temp=temp.nextChild;
  55. }
  56. //找到要出圈的前一个小孩
  57. Child temp2=temp;
  58. while(temp2.nextChild!=temp){
  59. temp2=temp2.nextChild;
  60. }
  61. //3.将数到m的小孩,退出圈
  62. temp2.nextChild=temp.nextChild;
  63. //让temp指向下一个数数的小孩
  64. temp=temp.nextChild;
  65. this.len--;
  66. }
  67. //最后一个小孩
  68. System.out.println("最后出圈的小孩:"+temp.no);
  69. }
  70.  
  71. //初始化单向环形链表
  72. public void createLink(){
  73. for(int i=1;i<=len;i++){
  74. if(i==1){
  75. //创建第一个小孩
  76. Child ch=new Child(i);
  77. this.firstChild=ch;
  78. this.temp=ch;
  79. }else{
  80. //创建最后一个小孩
  81. if(i==len){
  82. Child ch=new Child(i);
  83. temp.nextChild=ch;
  84. temp=ch;
  85. temp.nextChild=this.firstChild;
  86. }else{
  87. //继续创建小孩
  88. Child ch=new Child(i);
  89. temp.nextChild=ch;
  90. temp=ch;
  91. }
  92. }
  93. }
  94. }
  95. //打印该环形链表
  96. public void show(){
  97. //定义一个跑龙套
  98. Child temp=this.firstChild;
  99. do{
  100. System.out.print(temp.no+" ");
  101. temp=temp.nextChild;
  102. }while(temp!=this.firstChild);
  103. }
  104. }

java面向对象编程--Josephu问题(丢手帕问题)的更多相关文章

  1. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  2. java 面向对象编程。。。。

    经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...

  3. 《Java面向对象编程》

    <Java面向对象编程> 第11章 对象的生命周期 11.1  创建对象的方式 用new语句创建对象 运用反射手段,调用java.lang.Class 或者 java.lang.Const ...

  4. JAVA面向对象编程课程设计——网络版单机斗地主

    一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...

  5. JAVA面向对象编程课程设计——web版斗地主

    一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...

  6. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  7. Java面向对象编程(一)

    由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...

  8. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

  9. (一)如何理解java面向对象编程

    哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...

随机推荐

  1. JAVA-重载(overload)和重写(overrite)

    1.重载发生在同一个类中.有多个方法名相同,但是参数列表不同(包括参数个数和参数类型),和返回值无关,权限修饰符也无关. 2.重写(即覆盖)发生在子类和父类中.子类和父类的方法名.参数列表相同:子类的 ...

  2. Springboot项目启动后访问不到Controller

    1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...

  3. 【C#】【对象转XML】xml序列化

    笔记:xml序列化 /// <summary>        /// xml序列化        /// </summary>        /// <param nam ...

  4. 一个空格引起的错误。 python

    'render_field' tag requires a form field followed by a list of attributes and values in the form att ...

  5. FPM五:拆解前面的四——OVP做查询和结果

    说明:前面的例子是将list和search放到一个Feeder Class里的,这里来做拆解分步说明. 1.创建SEARCH的结构 2.创建RESULT的结构 表类型(不用表类型的话,需要自己在cla ...

  6. 【问题记录】MyBatis查询数据库返回多个不同类型参数的结果集的接收方式

    其实是个非常简单的问题,但是这玩意儿弄得我很难受,又浪费了一个下午的时间,简直了…… 问题大概是,我在查询数据库时,查询的结果有两个,一个是varchar格式的字段,一个int格式字段,例如: sel ...

  7. vue 修饰符

    Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation(). Vue.js通过由点(.) ...

  8. react 的基础

    首先下载React 的安装包,可以到官网下载.也可以使用React Demos 已经自带 React 源码,不用另外安装,只需把这个库拷贝到硬盘中使用. (可参考http://www.ruanyife ...

  9. windows下Redis安装及利用java操作Redis

    一.windows下Redis安装 1.Redis下载 下载地址:https://github.com/MicrosoftArchive/redis 打开下载地址后,选择版本 然后选择压缩包 下载 R ...

  10. (转)Windows10下的docker安装与入门 (一)使用docker toolbox安装docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...