鱼C论坛

 找回密码
 立即注册
查看: 3231|回复: 3

[技术交流] 高难度的约瑟夫环

[复制链接]
发表于 2020-6-11 21:59:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目如下:
提高挑战难度:编号为1~N的N个人按顺时针方向
围坐一圈,每人持有一个密码(正整数,可以自由
输入),
开始人选一个正整数作为报数上限值M,
从第一个人按顺时针方向自1开始顺序报数,报道M
时停止报数。报M的人出列,将他的密码作为新的M
值,从他顺时针方向上的下一个人开始从1报数,一
如此下去,直至所有人全部出列为止。(题目出处:(小甲鱼)数据结构和算法 18约瑟夫环)
因为我最近在学java 所以就用Java照这个思路做了一下代码如下
  1. //作者:铁头娃鸭
  2. //日期:2020.6。11
  3. //作用:进阶约瑟夫环(每个人都拿着一个密码数字,数密码上线次
  4. import java.io.*;
  5. import java.util.*;
  6. public class work7{
  7. public static void main(String args[]){
  8.   Cyc_link cyclink=new Cyc_link();
  9.     cyclink.set_len();
  10.     cyclink.create_link();
  11.   cyclink.set_k();
  12.     cyclink.play();
  13. }
  14. }
  15. class Child{
  16. int no;//编号
  17. int key;//手上持有的密码
  18. Child next=null;
  19.    public Child (int no){
  20.    this.no=no;
  21.   }
  22. }
  23. class Cyc_link{
  24. Scanner sr=new Scanner(System.in);
  25. // 先定义一个指向链表第一个小孩的的引用(头结点)
  26. Child first_child=null;
  27. Child temp=null;//跑龙套的temp
  28. int len=0;//表示共有几个小孩
  29. int k=0;//从第几个小孩开始数
  30.    int key=0;
  31.     public void set_len(){
  32.    System.out.println("参加游戏的人数");
  33.    this.len=sr.nextInt();
  34.                        }
  35.     public void set_k(){
  36.     System.out.println("从第几个人开始数?");
  37.       this.k=sr.nextInt();
  38.                        }
  39.   public void create_link(){
  40.             System.out.println("开始围成一个圈,并赋予每人人手上一位密码,");
  41.              for(int i=1; i<=len;i++){
  42.                          if(i==1){ //创建第一个小孩
  43.       Child ch=new Child(i);  
  44.        this.first_child=ch;
  45.        this.temp=ch;
  46.     System.out.print("第"+i+"人的密码:");
  47.            ch.key=sr.nextInt();
  48.            }  
  49.         else {
  50.             if (i==len){//最后一个小孩
  51.              Child ch=new Child(i);
  52.             System.out.print("第"+i+"人的密码:");
  53.            ch.key=sr.nextInt();
  54.               temp.next=ch;
  55.                   temp=ch;
  56.                temp.next=this.first_child;
  57.               
  58.                  }
  59.              else {//其余小孩
  60.             Child ch=new Child(i);
  61.               System.out.print("第"+i+"人的密码:");
  62.            ch.key=sr.nextInt();
  63.             temp.next=ch;
  64.              temp=ch;
  65.                     }
  66.                  }
  67.            }
  68.         }
  69.    public void play(){//开始游戏
  70.           //首先找到第个数数的那个人
  71.           for (int i=1;i<k;i++){
  72.                 temp=temp.next;
  73.                      }      
  74.                  this.key=temp.next.key;
  75.               //再开始数数并退圈
  76.               while(temp!=temp.next){
  77.                      for (int i=1;i<=this.key;i++){
  78.                             temp=temp.next;
  79.                               }
  80.                             this.key=temp.next.key;
  81.                             System.out.print("推出圈的人:"+temp.next.no+" ") ;
  82.                           temp.next=temp.next.next;
  83.                         
  84.               }
  85.                System.out.println("最后存活的人 :"+temp.no);
  86.           }
  87. }
复制代码

测试结果如下
参加游戏的人数
10
开始围成一个圈,并赋予每人人手上一位密码,
第1人的密码:2
第2人的密码:3
第3人的密码:4
第4人的密码:7
第5人的密码:6
第6人的密码:11
第7人的密码:22
第8人的密码:11
第9人的密码:1
第10人的密码:11
从第几个人开始数?
2
推出圈的人:5 推出圈的人:2 推出圈的人:7 推出圈的人:9 推出圈的人:1 推出圈的人:6 推出圈的人:4 推出圈的人:10 推出圈的人:8 最后存活的人 :3
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-11 22:40:23 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-12 07:57:30 | 显示全部楼层
都没加空格,把我难受的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-12 09:14:40 | 显示全部楼层
徐颖科 发表于 2020-6-12 07:57
都没加空格,把我难受的。

哈哈  不是有冒号嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-16 01:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表