约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称"丢手绢问题".)。

编号为1.2.3…….n的n个人按顺时针方向围坐一圈,开始任意选一个整数作为报数,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,从出列的下一个人开始报数,报到m的人再退出,如此下去直到剩下一个人为止。

1.第一种单向的环形链表解决

首先将链表中的节点Boy创建出来

/*** 创建Boy节点* * @author Administrator*/
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;}}

单向环形链表的添加方法

// 添加小孩 构成环形链表public void addBoy(int nums) {// 添加数目小于1时,不让游戏开始if (nums < 1) {System.out.println("nums的值不正确");}// 创建curBoy辅助变量 帮助构建环形Boy curBoy = null;// 使用for创建环形链表// 循环创建boy 创建的是第一个就让头的下一个指向自己构成环形for (int i = 1; i <= nums; i++) {Boy boy = new Boy(i);if (i == 1) {first = boy;first.setNext(first);// 用辅助变量一个一个走curBoy = first;} else {// 加入的是第二个就让辅助变量的下一个指向新增变量curBoy.setNext(boy);// 新增变量的下一个指向头boy.setNext(first);// 让辅助变量后移 一直当最后一个节点curBoy = boy;}}}

单向环形链表的遍历方法

/*** 遍历环形链表*/public void showBoy() {// 判断链表是否为空if (first == null) {System.out.println("没有任何小孩");return;}// 创建curBoy辅助变量 帮助构建环形Boy curBoy = first;while (true) {System.out.println("输出小孩的编号" + curBoy.getNo());if (curBoy.getNext() == first) {// 说明链表遍历完了System.out.println("遍历完毕");break;}// curBoy后移curBoy = curBoy.getNext();}}

然后创建单向链表的出圈方法

class CircleSingleLinkedList {// 创建一个first节点 不赋值private Boy first = null;/*** 出圈* 根据用户的输入 表示小孩  一共几个  从哪个小孩数数,数几下* @param nums*/public void countBoy(int nums, int firstNum, int count) {//起始位置不能大于小孩个数  链表为空也不行  开始位置不能小于1if (nums < firstNum ||  firstNum < 1) {System.out.println("参数不合理");return;}addBoy(nums);//看创建的链表是否成功if(first==null) {System.out.println("链表为空");}// 创建辅助指针 并通过循环让他指向环形链表的最后一个节点Boy helper = first;while(true) {if(helper.getNext()==first) {break;}helper=helper.getNext();}// 报数时first要移动到开始报数时的位置for (int i = 1; i < firstNum; i++) {first=first.getNext();helper=helper.getNext();}// 循环遍历while (true) {//假如辅助变量是first  说明只剩下一个节点if (helper == first) {System.out.println("说明圈中只有一个节点");break;}//开始数数  for循环结束 first的位置就是要删除的节点的位置for(int j = 1;j<count;j++) {//让first后移  helper也后移first=first.getNext();helper=helper.getNext();}//让first后移  然后helper指向 firstSystem.out.println("出圈的是"+first.getNo());first=first.getNext();helper.setNext(first);}System.out.println("最后一个是"+helper.getNo());}

2.第二种列表解决约瑟夫问题的思路

 //big是一共有多少个孩子  order是从哪个孩子开始  nums是隔几个开始public static void orderByInput(int big,int order,int nums){//创建了一个数组ArrayList<Integer> list = new ArrayList<>();//将每个学生加入到数组中for(int i =1;i<=big;i++){System.out.println("加入"+i+"个周硕");list.add(i);}//当列表中的数只有一个的时候将他打印出来while(true){if(list.size()==1){System.out.println("只剩下"+list.get(0)+"个周硕");break;}//求出要取出的孩子 从哪个孩子开始加上隔的数 就是下一个要去除的孩子//加上列表的元素数量是怕order+nums-1是负数  取模是为了数值超出列表长度Integer kid = list.get((order+nums-1+list.size())%list.size());//输出要移除的这个孩子的编号System.out.println("移除"+kid.intValue()+"个周硕");//移除这个孩子list.remove(kid);//让order后移order = (order+1+list.size())%list.size();}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("游戏规则 一共n个小孩 从第m个小孩开始  每次数到 k 就移除这个人 最后只剩下一个人");System.out.println("需要多少个人玩");int i1 = scanner.nextInt();System.out.println("第几个开始 最后剩下谁");int i12 = scanner.nextInt();System.out.println("最后剩下谁");int i13 = scanner.nextInt();orderByInput(i1,i12,i13);}

约瑟夫问题的几种解决方法相关推荐

  1. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  2. mysql workbench kernelbase.dll_电脑出现kernelbase.dll错误的两种解决方法

    KernelBase.dll是Windows操作系统的重要文件,它为各种应用程序提供服务.如果电脑提示kernelbase.dll错误,这该怎么处理?大家可以用电脑自带的防火墙或者是第三方软件来进行故 ...

  3. SVN被锁定的几种解决方法

    SVN被锁定的几种解决方法 参考文章: (1)SVN被锁定的几种解决方法 (2)https://www.cnblogs.com/smiler/p/4567116.html 备忘一下.

  4. IOS - No provisioning profiles with a valid signing identity 一种解决方法

    IOS - No provisioning profiles with a valid signing identity 一种解决方法 参考文章: (1)IOS - No provisioning ...

  5. 关于盒子塌陷的几种解决方法

    关于盒子塌陷的几种解决方法 参考文章: (1)关于盒子塌陷的几种解决方法 (2)https://www.cnblogs.com/xiaozhu-zhu/p/11946896.html (3)https ...

  6. [Bat]UNC路径不支持的2种解决方法

    [Bat]UNC路径不支持的2种解决方法 参考文章: (1)[Bat]UNC路径不支持的2种解决方法 (2)https://www.cnblogs.com/masonlu/p/10276546.htm ...

  7. Json返回时间中出现乱码问题的两种解决方法

    Json返回时间中出现乱码问题的两种解决方法 参考文章: (1)Json返回时间中出现乱码问题的两种解决方法 (2)https://www.cnblogs.com/hanyinglong/archiv ...

  8. windows 10 安装openssh 0x800f0954 的一种解决方法

    windows 10 安装openssh 0x800f0954 的一种解决方法 参考文章: (1)windows 10 安装openssh 0x800f0954 的一种解决方法 (2)https:// ...

  9. 429 too many requests错误出现在wordpress后台更新及官网的5种解决方法

    429 too many requests错误出现在wordpress后台更新及官网的5种解决方法 参考文章: (1)429 too many requests错误出现在wordpress后台更新及官 ...

最新文章

  1. android 时间轴动画教程,android 时间轴(listview实现) 源码
  2. 二叉树的先序/中序/后序(递归、非递归)+层序遍历
  3. c语言中函数调用的原理
  4. Codeforces Round #159 (Div. 2)
  5. 常见的一些正则表达式!
  6. linux中dpkg找不到命令_Linux中tree命令的使用
  7. xor命令,运算优先级,Matlab计算规则(从左至右),舍入误差,取整函数、求余函数和符号函数,mod和rem的区别
  8. 情人节 放出了 我囤积的 部分碎片 论点
  9. Essential singularity
  10. 华为云物联网设备接入及OBS使用
  11. ping ,time,TTL详解
  12. 有哪些地图编辑平台?制作地图软件哪个最好?
  13. Android经典项目案例开发实战宝典
  14. 【图像融合】基于matlab主成分结合小波离散变换PCA-DWT图像融合【含Matlab源码 2199期】
  15. 万字长文 | 2023届校招算法岗知识总结
  16. Unity3D学习:飞碟游戏进化版
  17. 【老鸟进阶】deepfacelab如何让融合更自然(二)清晰度篇
  18. show master status 时没有数据显示
  19. 06-数据科学的基础:数据收集之市场调查_02 次级资料
  20. 曾经风靡的1394接口是什么?有什么作用?

热门文章

  1. 工业4.0让德国制造业两年受损500亿?中国应怎样学习前车之鉴
  2. matlab图像读取原理,matlab中imread读入图像的原理
  3. Caused by: java.net.UnknownHostException: bogon: bogon: Name or service not known
  4. 自动登录TP-LINK路由器,获取所有信息,重启等等,实用方法
  5. 2022春节假期热门消费趋势洞察
  6. 从延禧攻略看,把自己打造成一个成功的产品你需要思考这些
  7. 锐浪报表打印时第二页会重复打印信息
  8. geo-tools从入门到使用
  9. 探寻木马进化趋势:APT32多版本远控木马Ratsnif的横向分析
  10. 2021.11.9洛谷苹果与虫子——c语言