好玩的约瑟夫环:有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。题目输入包括若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码,报数密码可能为1,题目要求按出队列顺序输出
时间: 2024-03-15 13:45:19 浏览: 157
好的,这是一个经典的约瑟夫问题。我来为你写一个Python程序解决这个问题:
```python
def josephus(m, n):
"""
:param m: 玩游戏的人数
:param n: 报数密码
:return: 出队列顺序
"""
if m < 1 or n < 1:
return None
# 初始化队列
queue = list(range(1, m+1))
res = []
# 模拟游戏过程
i = 0
while len(queue) > 0:
i = (i + n - 1) % len(queue)
res.append(queue.pop(i))
return res
# 测试
m = 7
n = 3
print(josephus(m, n)) # 输出 [3, 6, 2, 7, 5, 1, 4]
```
这个程序可以解决玩一次游戏的情况,如果需要玩多次游戏,可以在主程序中多次调用`josephus`函数即可。
阅读全文