假设n个旅客排成一个环形,依次顺序编号1,2,…,n。从某个指定的第1号开始,沿环计数,每数到第m个人就让其出列,且从下一个人开始重新计数,继续进行下去。这个过程一直进行到剩下k个旅客为止。 本游戏的要求用户输入的内容包括: 1. 旅客的个数,也就是n的值; 2. 离开旅客的间隔数,也就是m的值; 3. 所有旅客的序号作为一组数据要求存放在某种数据结构中。 本游戏要求输出的内容是包括 1. 离开旅客的序号; 2. 剩余旅客的序号; 所以,根据上面的模型分析及输入输出参数分析,可以定义一种数据结构后进行算法实现。用单向链表
时间: 2024-03-22 16:39:06 浏览: 103
数据结构中约瑟夫环的实现编号为1到n的n个人围成一圈,每人带一个密码c,以m为报数上限。然后从第一个人开始顺时针自1开始报数,报到m的人出列,将其密码作为新的m值,从他的下一个人开始,同样顺时针自1开始报数,依次循环下去,直到所有的人都出列!要求得到依次出列的那些人的编号序列!
4星 · 用户满意度95%
来存储旅客的编号,每次出列一个旅客就将其从链表中删除。具体的算法实现如下:
1. 定义一个单向链表,将旅客的编号依次插入链表中。
2. 设置一个计数器count,初始化为1,表示从第1个旅客开始计数。
3. 从第1个旅客开始,依次遍历链表中的每个节点,每次将count加1,当count等于m时,删除当前节点,将count重置为1。
4. 重复步骤3,直到链表中剩余k个节点,此时输出所有已删除节点的编号和剩余节点的编号即可。
以下是一段Python代码实现该算法:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def josephus(n: int, m: int, k: int) -> List[int]:
# 建立链表
head = ListNode(1)
cur = head
for i in range(2, n+1):
cur.next = ListNode(i)
cur = cur.next
cur.next = head
# 模拟出列过程
res = []
count = 1
while n > k:
if count == m:
res.append(cur.next.val)
cur.next = cur.next.next
count = 1
n -= 1
else:
cur = cur.next
count += 1
# 输出结果
remain = []
while cur.next != cur:
remain.append(cur.next.val)
cur = cur.next
remain.append(cur.val)
return res, remain
```
其中,n、m、k分别表示旅客的个数、离开旅客的间隔数和剩余旅客的个数,函数返回一个二元组,第一个元素是已删除旅客的编号列表,第二个元素是剩余旅客的编号列表。
阅读全文