java面向对象编程--Josephu问题(丢手帕问题)
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开始计数,直到最后一个结点从链表中删除算法结束。
- //使用单向链表
- public class Demo121 {
- public static void main(String[] args) {
- CycLink cyclink=new CycLink();
- cyclink.setLen(5);//链表长度
- cyclink.createLink();
- cyclink.setK(2);//从第几个人开始数
- cyclink.setM(2);//数几下
- cyclink.show();
- cyclink.play();
- }
- }
- class Child{
- int no;
- Child nextChild=null;
- public Child(int no){
- //给一个编号
- this.no=no;
- }
- }
- //单向环形链表
- class CycLink{
- //先定义一个指向链表第一个小孩的引用
- //指向第一个小孩的引用,不能动
- Child firstChild=null;
- Child temp=null;
- int len=0;//表示共有多少个小孩
- int k=0;
- int m=0;
- //设置m数几下
- public void setM(int m){
- this.m=m;
- }
- //设置环形链表大小
- public void setLen(int len){
- this.len=len;
- }
- //设置从第几个人开始数数
- public void setK(int k){
- this.k=k;
- }
- //开始play
- 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;
- }
- //找到要出圈的前一个小孩
- Child temp2=temp;
- while(temp2.nextChild!=temp){
- temp2=temp2.nextChild;
- }
- //3.将数到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);
- this.firstChild=ch;
- this.temp=ch;
- }else{
- //创建最后一个小孩
- if(i==len){
- Child ch=new Child(i);
- temp.nextChild=ch;
- temp=ch;
- temp.nextChild=this.firstChild;
- }else{
- //继续创建小孩
- Child ch=new Child(i);
- temp.nextChild=ch;
- temp=ch;
- }
- }
- }
- }
- //打印该环形链表
- public void show(){
- //定义一个跑龙套
- Child temp=this.firstChild;
- do{
- System.out.print(temp.no+" ");
- temp=temp.nextChild;
- }while(temp!=this.firstChild);
- }
- }
java面向对象编程--Josephu问题(丢手帕问题)的更多相关文章
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
- java 面向对象编程。。。。
经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...
- 《Java面向对象编程》
<Java面向对象编程> 第11章 对象的生命周期 11.1 创建对象的方式 用new语句创建对象 运用反射手段,调用java.lang.Class 或者 java.lang.Const ...
- JAVA面向对象编程课程设计——网络版单机斗地主
一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...
- JAVA面向对象编程课程设计——web版斗地主
一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...
- java面向对象编程知识点总结
一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...
- Java面向对象编程(一)
由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...
- JAVA学习(五):Java面向对象编程基础
Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
- (一)如何理解java面向对象编程
哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...
随机推荐
- JAVA-重载(overload)和重写(overrite)
1.重载发生在同一个类中.有多个方法名相同,但是参数列表不同(包括参数个数和参数类型),和返回值无关,权限修饰符也无关. 2.重写(即覆盖)发生在子类和父类中.子类和父类的方法名.参数列表相同:子类的 ...
- Springboot项目启动后访问不到Controller
1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...
- 【C#】【对象转XML】xml序列化
笔记:xml序列化 /// <summary> /// xml序列化 /// </summary> /// <param nam ...
- 一个空格引起的错误。 python
'render_field' tag requires a form field followed by a list of attributes and values in the form att ...
- FPM五:拆解前面的四——OVP做查询和结果
说明:前面的例子是将list和search放到一个Feeder Class里的,这里来做拆解分步说明. 1.创建SEARCH的结构 2.创建RESULT的结构 表类型(不用表类型的话,需要自己在cla ...
- 【问题记录】MyBatis查询数据库返回多个不同类型参数的结果集的接收方式
其实是个非常简单的问题,但是这玩意儿弄得我很难受,又浪费了一个下午的时间,简直了…… 问题大概是,我在查询数据库时,查询的结果有两个,一个是varchar格式的字段,一个int格式字段,例如: sel ...
- vue 修饰符
Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation(). Vue.js通过由点(.) ...
- react 的基础
首先下载React 的安装包,可以到官网下载.也可以使用React Demos 已经自带 React 源码,不用另外安装,只需把这个库拷贝到硬盘中使用. (可参考http://www.ruanyife ...
- windows下Redis安装及利用java操作Redis
一.windows下Redis安装 1.Redis下载 下载地址:https://github.com/MicrosoftArchive/redis 打开下载地址后,选择版本 然后选择压缩包 下载 R ...
- (转)Windows10下的docker安装与入门 (一)使用docker toolbox安装docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...