/1.约瑟夫环 //任务:一堆猴子都有编号,编号是1,2,3 ... n, 这群猴子(n个)按照1 ~n的顺序围坐一圈,从第1开始数, //每数到第m个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。请设计算法编写程序输出为大王的猴子的编号。单向循环链表
时间: 2024-03-18 12:41:45 浏览: 151
猴子选大王的算法 (约瑟夫环)或称循环链表
这是一个经典的约瑟夫环问题,可以使用单向循环链表来解决。具体步骤如下:
首先创建一个单向循环链表,将每只猴子的编号存入节点中。然后,从第一个节点开始数数,每数到第m个节点,就将该节点从链表中删除,同时计数器加1,直到链表中只剩下一个节点为止。最后,输出最后一个节点的编号,即为大王的猴子编号。
以下是Java代码示例:
```java
public class MonkeyKing {
public static int findKing(int n, int m) {
// 创建单向循环链表
Node head = new Node(1);
Node tail = head;
for (int i = 2; i <= n; i++) {
tail.next = new Node(i);
tail = tail.next;
}
tail.next = head;
// 删除节点直到链表中只剩下一个节点
Node curr = head;
while (curr.next != curr) {
for (int i = 1; i < m; i++) {
curr = curr.next;
}
curr.next = curr.next.next;
}
return curr.val;
}
public static void main(String[] args) {
int n = 5; // 猴子总数
int m = 3; // 数到第m个猴子出圈
int king = findKing(n, m);
System.out.println("大王的编号为:" + king);
}
}
class Node {
int val;
Node next;
public Node(int val) {
this.val = val;
}
}
```
阅读全文