约瑟夫环 痛定思痛。 2022-11-27 06:54 184阅读 0赞 # 约瑟夫环 # ## 1、参考资料 ## https://blog.csdn.net/shuaicihai/article/details/54847433 ## 2、使用数组 ## ### 2.1、代码思路 ### 先使用一个数组保存每个人的编号,编号从 1~n,如果此人的编号不为零,则表示此人没有蹲下;如果此人的编号为零,则表示此人已蹲下(不要去打扰他了) ### 2.2、代码实现 ### * 代码:数组实现 /** * @ClassName JosephuDemo * @Description TODO * @Author Heygo * @Date 2020/8/12 20:05 * @Version 1.0 */ public class JosephuDemo { public static void main(String[] args) { josephu(5, 2, 3); } /** * 数组解决约瑟夫问题 * * @param personCount 总人数 * @param startNumber 从第 startNumber 个人开始数(索引从 1 开始) * @param number 每次数 number 个人,然后让此人蹲下 */ public static void josephu(int personCount, int startNumber, int number) { // 把人放到数组中 int[] persons = new int[personCount]; for (int i = 1; i <= personCount; i++) { persons[i] = i; } // 当前正在遍历哪个人?(指针) int curIndex = startNumber - 1; // 蹲下的人数 int downCount = 0; // 当前轮轮询的人数 int cycleCount = 0; // 全部人蹲下之后,才能结束 while (downCount < personCount) { // 如果此人已经蹲下了,则跳过 if (persons[curIndex % persons.length] == 0) { curIndex++; } else { // 否则此人没有蹲下,cycleCount++ 表示轮训次数加 1 cycleCount++; // 如果已经数了 number 次,则需要蹲下 if (cycleCount == number) { // 将此人编号输出后,让此人蹲下 System.out.println(persons[curIndex % persons.length]); persons[curIndex % persons.length] = 0; // 轮询计数器置零 cycleCount = 0; // 蹲下人数加 1 downCount++; } // 遍历下一个人 curIndex++; } } } } * 程序运行结果 4 2 1 3 5 ## 3、使用队列 ## ### 3.1、代码思路 ### 先按照初始顺序将小可爱们都保存在队列中,然后不停地让队头的小可爱出队 1. 如果计数器 cycleCount 达到预期值,则将计数器重置(这个小可爱就真正地出队了,再也回不来了) 2. 否则,将出队的小可爱再次放回到队尾,继续参与游戏 ### 3.2、代码实现 ### * 代码 /** * @ClassName JosephuDemo * @Description TODO * @Author Heygo * @Date 2020/8/12 20:05 * @Version 1.0 */ public class JosephuDemo { public static void main(String[] args) { josephu(5, 2, 3); } /** * 链表解决约瑟夫问题 * * @param personCount 总人数 * @param startNumber 从第 startNumber 个人开始数(索引从 1 开始) * @param number 每次数 number 个人,然后让此人蹲下 */ public static void josephu(int personCount, int startNumber, int number) { // 小可爱们组成的队列 Queue<Integer> cutes = new LinkedList<>(); // 将小可爱们放入队列中 for (int i = startNumber; i <= personCount; i++) { cutes.add(i); } for (int i = 1; i < startNumber; i++) { cutes.add(i); } // 记录本次轮询了多少人 int cycleCount = 0; // 有一个小可爱蹲下,则队列少一个人 while (cutes.isEmpty() == false) { // 将队头的小可爱出队 Integer cute = cutes.remove(); // 如果轮询次数等于 number,让这个小可爱出队 if(++cycleCount == number){ System.out.println(cute); cycleCount = 0; }else{ // 否则将小可爱加到队尾 cutes.add(cute); } } } } * 程序运行结果 5 1 4 2 7 3 6 ## 4、使用链表 ## ### 4.1、代码思路 ### 以后有时间再做啦~~~ ### 4.2、代码实现 ###
相关 约瑟夫环 约瑟夫环 1、参考资料 https://blog.csdn.net/shuaicihai/article/details/54847433 2、使用数组 痛定思痛。/ 2022年11月27日 06:54/ 0 赞/ 185 阅读
相关 约瑟夫环 package com.someusefuldesign.demo; import java.util.ArrayList; /约瑟 桃扇骨/ 2022年08月13日 15:54/ 0 赞/ 183 阅读
相关 约瑟夫环 \include<stdio.h> \include<stdlib.h> /\ 约瑟夫环是一个数学的应用问题: 已知n个人(以编号1,2,3...n分别表示)围 ╰半夏微凉°/ 2022年08月07日 01:53/ 0 赞/ 204 阅读
相关 约瑟夫环 约瑟夫环 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个 怼烎@/ 2022年07月15日 13:39/ 0 赞/ 199 阅读
相关 约瑟夫环 N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。 例如:N = 3,K = 2。2号先出列,然后是 桃扇骨/ 2022年06月11日 06:26/ 0 赞/ 208 阅读
相关 约瑟夫环 【问题描述】 编号为 1,2,...,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随 机数 m>0,从编号为 1 的人开始,按顺时针方向 1 今天药忘吃喽~/ 2022年04月22日 06:06/ 0 赞/ 254 阅读
相关 约瑟夫环 > 约瑟夫环运作如下: > 1、一群人围在一起坐成 \[2\] 环状(如:N) > 2、从某个编号开始报数(如:K) > 3、数到某个数(如:M)的时候,此人出列, 阳光穿透心脏的1/2处/ 2022年03月22日 16:38/ 0 赞/ 303 阅读
相关 约瑟夫环 约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规 曾经终败给现在/ 2022年02月28日 00:54/ 0 赞/ 238 阅读
相关 约瑟夫环 编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一 开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时 r囧r小猫/ 2021年12月20日 04:29/ 0 赞/ 320 阅读
相关 约瑟夫环 int cir(int n,int m) { int p=0; for(int i=2;i<=n;i++) { 我会带着你远行/ 2021年12月16日 15:13/ 0 赞/ 330 阅读
还没有评论,来说两句吧...