package com.qingfeng;
/**
* @author Administrator
* 功能:约瑟夫问题:
* 设编号分别为:1,2,...,n的n个人围坐一圈。
* 约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,
* 他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。
*/
public class Josephus { public static void main(String[] args) {
// TODO Auto-generated method stub
KidLink kid = new KidLink();
kid.setLength(5);
kid.creatLink();
kid.setM(2);
kid.setK(3); kid.show();
kid.play();
}
}
//孩子类
class Kid
{
//成员变量
int no;//孩子编号
Kid nextKid;//下一个孩子的引用 关键点! //构造方法
public Kid(int no)//设置孩子的编号
{
this.no = no;
}
} //孩子环形链表类
class KidLink
{
//成员变量
Kid firstKid;//第一个孩子的引用 不能动!!关键点! int i;
int len;//圈的长度:多少个人 Kid temp;//跑龙套 int m;//约定开始数数的那个人
int k;//约定数几下出圈 //成员方法
//设置循环链表的长度即
public void setLength(int len)
{
this.len = len;
} //1.创建孩子3.连成环状
public void creatLink()
{
for(i=1; i<=len; i++)
{
if(i==1)//第一个孩子
{
Kid ch = new Kid(i);//创建第一个孩子 ch为第一个孩子的引用
firstKid = ch;//firstKid指向第一个孩子!
temp = ch;//跑龙套temp也指向当前孩子!
}
else
{
if(i == len)//最后一个孩子
{
Kid ch = new Kid(i);//创建最后一个孩子
temp.nextKid = ch;
temp = ch;
temp.nextKid = firstKid;
}
else
{
Kid ch = new Kid(i);//创建剩余的孩子
temp.nextKid = ch;//跑龙套(孩子的引用)的下一个孩子(相当于next指针)指向当前 孩子!
temp = ch;//跑龙套指向新的当前孩子!
}
}
}
}
//打印孩子编号即围成的圈
public void show()
{
temp = firstKid;
do{
System.out.print(temp.no+" ");
temp = temp.nextKid;
}while(temp!= firstKid);//理解do while的好处
} //设置m的值
public void setM(int m)
{
this.m = m;
}
//设置n的值
public void setK(int k)
{
this.k = k;
}
//开始玩游戏
public void play()
{
temp = firstKid;
//1.先找到数数的那个人m
for(i=1; i<m; i++)//易错!不是"等于"
{
temp = temp.nextKid;
}
while(len!=1){
System.out.print(" m的值为"+temp.no);
//2.数n下找到出圈的人即temp
for(i=1; i<k; i++)//易错!不是"等于"
{
temp = temp.nextKid;
}
//3.temp退圈
//先找到temp的前一个人即temp2
Kid temp2;
temp2 =temp;
while(temp2.nextKid != temp)
{
temp2 = temp2.nextKid;
}
temp2.nextKid = temp.nextKid; //删除语句 如第二人指向第四个人
System.out.print(" 出圈人"+temp.no);
temp = temp.nextKid;//开始数数的人temp指向被删的下一个 len--;//每次少一个人
}
System.out.println(" 最后出圈的是"+temp.no);
}
}

Josephus问题Java实现的更多相关文章

  1. 约瑟夫环 --- 面向对象 --- java代码

    约瑟夫环 的 面向对象 解法 罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个 ...

  2. 算法Sedgewick第四版-第1章基础-017一约瑟夫问题(Josephus Problem)

    /************************************************************************* * * Josephus problem * * ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. Josephus环类问题,java实现

    写出一个双向的循环链表,弄一个计数器,我定义的是到三的时候,自动删除当前节点,很简单. package Com; import java.util.Scanner; /* * 约瑟夫环问题,有n个人组 ...

  5. Josephus问题的java实现

    import java.util.ArrayList; import java.util.ListIterator; public class Josephus { public static voi ...

  6. Josephus Problem的详细算法及其Python、Java实现

      笔者昨天看电视,偶尔看到一集讲述古罗马人与犹太人的战争--马萨达战争,深为震撼,有兴趣的同学可以移步:http://finance.ifeng.com/a/20170627/15491157_0. ...

  7. [Java]使用队列求解josephus问题

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过个人(因为第一个人已 ...

  8. Java实现约瑟夫环

    什么是约瑟夫环呢? 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个 ...

  9. 约瑟夫问题(java实现)

    方法一.自定义的链表实现 package com.code.yuesefu; public class YueSeFuList { public static void main(String[] a ...

随机推荐

  1. Apache Flink 1.9重磅发布!首次合并阿里内部版本Blink重要功能

    8月22日,Apache Flink 1.9.0 版本正式发布,这也是阿里内部版本 Blink 合并入 Flink 后的首次版本发布.此次版本更新带来的重大功能包括批处理作业的批式恢复,以及 Tabl ...

  2. centos7.6 安装jdk1.8

    1. 下载 jdk-8u211-linux-x64.tar.gz文件. 2. 创建/opt/soft目录,# cd /opt, # mkdir soft, #tar -zxvf  jdk-8u211- ...

  3. 对比Model前后数据保存不同值

    1.示例代码 public class SysLogBLL<T,W> : BLLBase where T : new() { #region 比较方法 /// <summary> ...

  4. 洛谷1850(NOIp2016) 换教室——期望dp

    题目:https://www.luogu.org/problemnew/show/P1850 状态里记录的是”上一回有没有申请“,而不是”上一回申请成功否“,不然“申请 j 次”就没法转移了. dou ...

  5. mac 将本地文件上传到vps

    打开mac终端 假设通过ssh连接远程vps命令为. ssh root@194.10.10.23 -p92322 (说明:92322表示端口号,一般vps端口号默认是22) 那么复制本地文件到终端的命 ...

  6. mysql查询某个字段并修改

    比如我存储的数据,有的是 山东,有的是山东省 我想统一改为山东省 UPDATE t_security SET province = REPLACE( province, '山东', '山东省' ) W ...

  7. idea目录结构子目录在父目录后面跟着改成树形结构

    1.点击项目窗口的设置按钮 2.取消Compact Middle Packages选项的对勾即可

  8. vue项目及插件

    vue项目的创建 方法1: cmd中执行 vue ui vue会创建一个socket,方便快捷 方法2: 命令行建立 vue create v-proj //创建项目名为v-proj的项目文件 > ...

  9. Appium_Python_Client介绍

    一.Appium_Python_Client介绍 Appium的实用方法都藏在Client的源码里,对于driver和webelement实例,均有对应的元素查找方法(webelement查找的是下面 ...

  10. 微信小程序--轮播图,标题,盒子,tab栏的合成例子

    小程序是什么? 微信小程序,是一种不需要下载安装即可使用的应用,用户扫一扫或搜一下即可打开应用,在微信-发现-小程序可打开应用. 一.小程序的样式编写: 目录结构: app.json { " ...