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

分析:用一个不带头结点的循环列表处理:先构成一个有n个节点的单循环链表,然后从K节点开始计数,记到m时,对应节点从链表中删除,然后在从被删除节点的下一个节点又从一开始计数,直到最后一个节点从链表中被删除。

/**
 * 功能:丢手帕问题(约瑟夫)
 */
package com.lin;

public class Demo4 {

/**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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;
    //设置链表大小
    public void setlen(int len){
        this.len=len;
    }
    //设置从第几个人开始数
    public void setk(int k){
        this.k=k;
    }
    //设置m
    public void setm(int m){
        this.m=m;
    }
    //开始play
    public void play(){
        temp=this.firstchild;
        //1.先找到开始数数的人
        for (int i=1;i<k;i++){
            temp=temp.nextchild;//temp指向了应该被删除的人
        }
        while(this.len!=1){
        //2.数 m下
        for (int j=1;j<m;j++){
            temp=temp.nextchild;
             System.out.print("第"+j+"个出圈的小孩次序"+temp.no+" ");
            
        }
        //找到出圈小孩的前一个小孩
        Child temp2=temp;
        while(temp2.nextchild!=temp){
            temp2=temp2.nextchild;
        }
        
        //3.数到m的人,删除
        //temp2是每次出圈的前一个小孩,
        //temp是每次出圈的后一个小孩
        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; //temp也随着走一个,指向刚进来的小孩
                 }
                }
               }
              }
    //打印该环形链表
    public void show(){
        //定义一个跑龙套
        Child temp=this.firstchild;
        do{
             System.out.print(temp.no+" ");
             temp=temp.nextchild;
            
        }while(temp!=this.firstchild);
    }
}

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

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

    /** * 作者:徐守威 * 功能:约瑟夫问题(丢手帕问题) * 具体问题:设编号为1,2,3....n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始 * 报数,数到m的那个 ...

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

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

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

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

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

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

  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. python零基础入门教材-Python零基础入门到精通自学视频教程
  2. 【算法】快速排序与归并排序对比
  3. 2年Java面试提问总结
  4. linux安装java_linux中替换系统自带的OpenJDK
  5. 今天学了瀑布流的js方法
  6. POJ - 2828 Buy Tickets(线段树+思维/Splay+模拟)
  7. word文档下划线无法显示的解决方法
  8. Web前端面试指导(十四):如何居中一个元素(正常、绝对定位、浮动元素)?
  9. 保存远程图片到本地 同时取得第一张图片并创建缩略图
  10. 【基础知识】~ 集成电路设计流程,以及各阶段所使用的EDA工具
  11. 基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计
  12. Egert实现五点连线(创意参考:网易爱的不同定义)[附源码]
  13. chm 打不开 解决办法
  14. 。快充的原理有三种:电压不变、提升电流,电流不变,提升电压,电流电压两者都提高。要想达到这三种方式的其中一种,我们都需要对充电头和充电线进行掌控。
  15. [ROS] KDL + DH 参数 + 正解
  16. htc升级鸿蒙,HTC手机卡刷教程,固件升级教程
  17. windows11正式版官方系统原版镜像下载: Win11 21H2 Build 22000.613发布
  18. cancase vector_vector CANcase 1630
  19. 可乐瓶游戏c语言,中班协调性体育游戏—玩可乐瓶
  20. 怎么修改代码文件创建时间

热门文章

  1. drools快速入门:简介、语法和结构
  2. 项目案例:网上书店数据库设计
  3. 事务(Transaction)的特性
  4. Spring属性注入的三种方式(超详细)
  5. codeforces 332b Maximum Absurdity dp
  6. python莱布尼茨法计算π_python圆周率计算(带进度条)
  7. 网络协议分析(最全)
  8. 台式计算机usb接口无反应6,如何解决电脑的USB接口没反应,教您如何解决
  9. 玩转OpenCV之一:关于OpenCV学习版本的选择
  10. android中的ellipsize设置(省略号的问题)