带密码的约瑟夫问题:编号为1,2,......,n的n个人按照顺时针方向围坐一圈,每个人有自己的编号(正整数)、姓名和密码(正整数)三个数据项。一开始任选一个正整数作为报数上限值,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出队为止。设计一个程序来求出出队顺序。写出代码
时间: 2023-10-21 10:03:40 浏览: 126
好的,下面是带密码的约瑟夫问题的代码:
```python
class Person:
def __init__(self, name, number, password):
self.name = name
self.number = number
self.password = password
def josephus(n, m, people):
out_list = []
password = 0
while len(people) > 0:
count = 0
while count < m:
password = people[(password + 1) % len(people)].password
count += 1
out_list.append(people.pop(password % len(people)))
return out_list
# 测试
people = [Person('Alice', 1, 123), Person('Bob', 2, 456), Person('Charlie', 3, 789), Person('David', 4, 101)]
out_list = josephus(4, 3, people)
print([person.name for person in out_list])
```
其中,`Person` 类表示每个人的信息,`josephus` 函数接收三个参数:总人数 `n`、报数上限 `m` 和人员列表 `people`。函数返回出队顺序的人员列表。在函数中,我们使用了一个 `out_list` 列表来记录出队顺序,每次找到报数为 `m` 的人时,将其从人员列表 `people` 中移除,并将其 `password` 作为新的报数上限 `m`。在整个游戏过程中,我们不断循环报数,直到 `people` 列表为空,最后返回 `out_list` 列表即可。以上代码中的 `Person` 类只是为了演示,如果您需要更多的人员信息,可以扩展该类。
阅读全文