约瑟夫环-猴子选大王(变型题)
约瑟夫环-猴子选大王(变型题)
接着上篇猴子选大王继续展开,上篇讲的是有m个猴子,从第一个猴子开始报数,当报到n时,第n个猴子出去,从n+1猴子开始,从1继续报数。
这篇我们来说,从任意猴子k的位置开始报数,当报到n时,第n个猴子出去,从n+1猴子开始,从1继续报数
问题描述:
约瑟夫环运作如下:
1、一群猴子围在一起坐成环状(如:N)2、从某个编号开始报数(如:K)3、数到某个数(如:M)的时候,此猴出列,下一个猴子重新报数4、一直循环,直到所有猴子出列,约瑟夫环结束,同时输出最后的大王。
解题思路:
我们还是用循环链表解决,这里有两种方法,一种是根据上篇讲的那样,构造循环链表,利用循环操作将头指针指向第k个结点上,后续操作和上篇一样
代码如下:
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入猴子数N: ");int n = sc.nextInt();System.out.println("请输入开始报数编号K: ");int k = sc.nextInt();System.out.println("请输入出列数M: ");int m = sc.nextInt();if(k > n || m > n) {System.out.println("编号K或者M不能大于猴子总数N");System.exit(0);}ListNode head = createListNode(n);while(k != 1){head = head.next;k--;}int count = 1;ListNode pre = null;while(head.next != head){pre = head;head = head.next;count++;if(count == m){System.out.println("当前出局人是: "+ head.val);pre.next = head.next;head = pre.next;count = 1;}}System.out.println("最后的大王是: "+ head.val);}public static ListNode createListNode(int m){ListNode head = new ListNode(1);if(m == 1) return head;ListNode cur = head;for(int i = 2;i <= m;i++){ListNode tmp = new ListNode(i);cur.next = tmp;cur = tmp;}cur.next = head;return head;}
}
另一种就是在构造循环链表过程中,直接将头指针定义为第k个猴子,后续操作和上篇代码一样。
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入猴子数N: ");int n = sc.nextInt();System.out.println("请输入开始报数编号K: ");int k = sc.nextInt();System.out.println("请输入出列数M: ");int m = sc.nextInt();if(k > n || m > n) {System.out.println("编号K或者M不能大于猴子总数N");System.exit(0);}ListNode head = createListNode(n, k);int count = 1;ListNode pre = null;while(head.next != head){pre = head;head = head.next;count++;if(count == m){System.out.println("当前出局人是: "+ head.val);pre.next = head.next;head = pre.next;count = 1;}}System.out.println("最后的大王是: "+ head.val);}public static ListNode createListNode(int n,int k){ListNode head = new ListNode(k);ListNode cur = head;for(int i = k;i<n;i++){ListNode tmp = new ListNode(i + 1);cur.next = tmp;cur = tmp;}for(int i = 0;i<k - 1;i++){ListNode tmp = new ListNode(i + 1);cur.next = tmp;cur = tmp;}cur.next = head;return head;}
约瑟夫环-猴子选大王(变型题)相关推荐
- 约瑟夫环 猴子选大王
<? /*** 猴子选大王:一群猴子排成一圈,按1,2,-,n依次编号.* 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,* 如此不停的进行下去,直 ...
- 约瑟夫环 猴子选大王的问题
问题: 有M只猴子围成一圈,按序每只从1到M中的编号,打算从中选出一个大王:经过协商,决定出选大王的规则:从第一个开始循环报数,数到N的猴子出圈,最后剩下来的就是大王.要求:从键盘输入M.N,编程计算 ...
- 约瑟夫问题(猴子选大王)
n只猴子要选大王,选举方法如下:所 有猴子按 1,2 --- n 编号并按照顺序围成一圈, 从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外, 下一只猴子再次由1开始报数, 如此循环,直到 ...
- 循环链表-约瑟夫问题-猴子选大王
总时间限制(Time limit): 1000ms 内存限制(Memory limit): 65536kB 描述(Description) 有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第 ...
- 猴子选王c语言链表程序代码,C语言程序设计-猴子选大王[链表应用]
2032 猴子选大王 Description 有N只猴子,从1~N进行编号.它们按照编号的顺时针方向排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报的第一个数字为1,以后每只猴子报的数字都是它们前 ...
- python猴子选大王_sicily 猴子选大王
题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数 ...
- 数据结构猴子选大王java_数据结构例子-猴子选大王
约瑟夫问题(猴子选大王): n只猴子要选大王,选举办法如下:所有猴子按1,2,-,n编号围坐一圈,从第一号开始按1,2,-,m报数,凡报m号的推出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴 ...
- 约瑟夫环问题之猴子选大王
猴子选大王的描述为:n只猴子围成一圈,顺时针方向从1到n编号.之后从1号开始沿顺时针方向让猴子从1,2,...,m依次报数,凡是报到m的猴子,都让其出圈,取消候选资格.然后不停的按顺时针方向报数,让报 ...
- Python 猴子选大王(约瑟夫环)算法
def KingElect(totalNum, startNum, intervalNum):'''猴子选大王totalNum:猴子总数tartNum:开始序号intervalNum:间隔数'''mo ...
最新文章
- 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间
- 10分钟内把永远跑不完的存储过程变为2秒跑完
- Docker 常见问题 (FAQ)-2015
- C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
- 自己动手写CPU(7)转移指令的实现
- 计算机图形相关输出设备,计算机图形输出设备.ppt
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现
- 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
- 开关造成的毛刺_玻璃面板开关钻孔加工
- 管理后台--3,修改分类
- 一分钟让你了解蓝桥杯(电子类)单片机比赛规则
- python 运行报错 Process finished with exit code -1073740791 (0xC0000409)
- 美世家无线点菜android,美世家无线点菜成功实现iPad mini平台应用
- 2022-我的秋招之旅
- KNIME 安装配置
- C语言多线程之“哲学家就餐”问题
- 基于Pytorch的强化学习(DQN)之 Experience Replay
- 淘宝浏览足迹功能实现(含代码)--cookie案例
- 基于Neo4j中医方剂药材知识图谱大数据可视化分析系统的设计与开发
- mac微信小程序源代码找回