一、约瑟夫环问题

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

二、解决思路

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

三、实现代码

1.需要的数据结构

节点

class Boy{
private int no;//编号
private Boy next;
public Boy(int no){
this.no=no;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public Boy getNext() {
return next;
}
public void setNext(Boy next) {
this.next = next;
}
@Override
public String toString() {
return "Boy{" +
"no=" + no +
'}';
}
}

单向环形链表

class CircleList{

    private Boy first = null;

    /**
*
* @param startNo 从第几个小孩开始数
* @param countNo 每次数几下
* @param nums 小孩的数量
*/
public void outOfCircle(int startNo, int countNo,int nums){
if (first==null || startNo<1|| startNo>nums){
System.out.println("参数输入有误");
return;
}
//创建辅助指针helper即要出圈小孩的前一个节点
Boy helper = first;
while (true){
if (helper.getNext()==first){
break;//helper已经到达first前的节点
}
helper=helper.getNext();
}
//移动到开始报数的位置
for (int i = 0; i <startNo-1 ; i++) {
first = first.getNext();
helper =helper.getNext();
}
//开始报数
while(true){
if(helper == first){//只有一个节点
break;
}
for (int i = 0; i <countNo-1 ; i++) {
//1、寻找待出圈的小孩、循环完成时,first就是要出圈的小孩
first = first.getNext();
helper =helper.getNext();
}
System.out.printf("出圈小孩编号:%d\n",first.getNo());
helper.setNext(first.getNext());
first=first.getNext();
}
System.out.printf("最后留在圈中的小孩编号:%d\n",first.getNo());
} public void addBoy(int nums){
if (nums<1){
System.out.println("数量有误");
return;
}
Boy curBoy =null;
for (int i = 0; i < nums; i++) {
Boy boy =new Boy(i+1);
//如果是第一个小孩,指向本身
if (i==0){
first=boy;
first.setNext(first);
curBoy=first;
}else{
curBoy.setNext(boy);
boy.setNext(first);
curBoy=boy;
}
}
} public void display(){
if (first==null){
System.out.println("链表为空");
return;
}
Boy curBoy = first;
while(true){
System.out.printf("小孩的编号:%d\n",curBoy.getNo());
if (curBoy.getNext()==first){
break;
}
curBoy=curBoy.getNext();//后移
}
}
}
2.测试代码与结果

测试类

public class Josepfu {

    public static void main(String[] args) {
CircleList c = new CircleList();
c.addBoy(5);
c.outOfCircle(1,2,5);
} }

运行结果

单向环形链表解决约瑟夫环(Josephus)问题的更多相关文章

  1. PHP算法学习(8) 环形链表 解决约瑟夫问题

    2019年2月25日17:29:17 Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈 ...

  2. php实现单,双向链表,环形链表解决约瑟夫问题

    传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季  http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...

  3. 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)

    链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...

  4. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

    1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...

  5. 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用

    什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...

  6. C++循环链表解决约瑟夫环问题

    约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以 ...

  7. 循环列表的Java实现,解决约瑟夫环问题

    import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...

  8. php解决约瑟夫环的问题

    php里面解决约瑟夫环还是比较方面的,但是下面的方法太费空间 <?php class SelectKing{ private $m;//幅度 private $n;//总数 public fun ...

  9. PHP解决约瑟夫环问题

    PHP解决约瑟夫环问题 一.总结 二.PHP解决约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到 ...

随机推荐

  1. CTE(With As)

    WITH tabdate(dt) AS ( FROM dual UNION ALL FROM tabdate WHERE dt ) SELECT * FROM TabDate ; 一.With Tab ...

  2. App的数据如何用python抓取

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. App中的数据可以用网络爬虫抓取么 答案是完全肯定的:凡是可以看到的APP数 ...

  3. stand up meeting 1/14/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  主要对生词本卡片的整体设计做修改:协助主程序完成popup部分 ...

  4. work of 1/5/2016

    part 组员                今日工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云 UI页面切换,词本显示下滑条     6 继续下滑条等增删补 ...

  5. Leetcode802-找到最终的安全状态(Python3)

    刚开始没思路,还以为是利用二维矩阵直接标记节点间的有向路径,最后循环遍历就能得到结果,结果最后发现方向是错的,之后看了大佬们写的代码,发现原来是用出度来实现节点是否安全的. 照着大佬们的思路重新写了一 ...

  6. python白帽子/黑客/实战编程教程

    Python搜索爬虫抓取超高清视频教程_第一期Python搜索爬虫抓取超高清视频教程_第二期Python搜索爬虫抓取视频教程_第三期Python搜索爬虫抓取视频教程_第四期Python搜索引擎爬虫抓取 ...

  7. vue2.x学习笔记(十七)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12616847.html. 动态组件&异步组件 在前面学习组件基础的时候学习过动态组件,官方文档给出过一个例 ...

  8. SpringCloud-Hystrix 服务降级、熔断

    Hystrix 是什么? Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时.异常等,Hystrix 能够保证在一个依赖出问题的情况下 ...

  9. 【高频 Redis 面试题】Redis 事务是否具备原子性?

    一.Redis 事务的实现原理 一个事务从开始到结束通常会经历以下三个阶段: 1.事务开始 客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑. 服务器会在客户端状态(redisClien ...

  10. pytorch torchversion自带的数据集

    from torchvision.datasets import MNIST # import torchvision # torchvision.datasets. #准备数据集 mnist = M ...