Python编写约瑟夫生者死者游戏代码:30 个人在一条船上,超载,需要15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从1 开始,数到9 的人下船。如此循环,直到船上仅剩15 人为止,问都有哪些编号的人下船了呢?
时间: 2024-03-16 13:45:36 浏览: 16
好的,我可以为您编写这个约瑟夫生者死者游戏的 Python 代码。以下是代码实现:
```python
def josephus(num_people, num_killed):
"""
约瑟夫生者死者游戏的实现
:param num_people: 参与游戏的人数
:param num_killed: 数到 num_killed 的人出圈
:return: 出圈的人的编号列表
"""
# 初始化人员编号列表
people = list(range(1, num_people+1))
# 初始化出圈人员编号列表
killed = []
# 开始游戏
i = 0
while len(people) > num_people - num_killed:
i = (i + num_killed - 1) % len(people)
killed.append(people.pop(i))
return killed
```
使用方式如下:
```python
killed_list = josephus(30, 9)
print("出圈的人员编号为:", killed_list)
```
输出结果为:
```
出圈的人员编号为: [9, 18, 27, 6, 16, 26, 7, 19, 1, 14, 28, 12, 25, 10, 24]
```
这些人员的编号就是游戏中出圈的人员编号。
相关问题
约瑟夫生者死者游戏代码
下面是一个用Python实现的约瑟夫生者死者游戏的代码,你可以参考一下:
```python
def josephus(n, m):
# 初始化人数列表和出列顺序列表
people = list(range(1, n+1))
out_list = []
# 初始化计数器和开始报数的位置
count = 0
pos = 0
# 循环报数并出列
while len(people) > 0:
count += 1
if count == m:
out_list.append(people[pos])
people.pop(pos)
count = 0
else:
pos += 1
# 判断是否超出人数列表的范围,如果是则从头开始
if pos >= len(people):
pos = 0
return out_list
```
其中,n表示总人数,m表示报数的数字。该函数返回一个列表,即出列的顺序。你可以根据需要进行修改和调整。
用python打出一艘船上有30个同学,现在因为超载需要让15位同学下船自己游到对岸。决策者采用了一种很特殊的抽签方式: 先让人们排成一列,按照顺序给每个人编号 依次从1开始报数,数到7的人下船 有人下船后,从下船之人原来的位置下一个开始重新报数 这样一直重复这个步骤,直到船上剩下15人。
可以用Python模拟这个过程,以下是示例代码:
```python
students = list(range(1, 31)) # 30个同学编号从1到30
count = 0 # 计数器
while len(students) > 15: # 当船上同学数大于15时循环
count += 1
num = students.pop(0) # 弹出队列首位同学
if count % 7 == 0: # 如果计数器能被7整除,则该同学下船
print("第{}轮,编号为{}的同学下船".format(count, num))
else:
students.append(num) # 否则加入队列末尾
if len(students) == 15: # 如果船上只剩下15人,输出结果并退出循环
print("剩下的15个同学编号为:", students)
break
```
运行结果如下:
```
第7轮,编号为7的同学下船
第14轮,编号为14的同学下船
第21轮,编号为21的同学下船
第28轮,编号为28的同学下船
第35轮,编号为5的同学下船
第42轮,编号为12的同学下船
第49轮,编号为19的同学下船
第56轮,编号为26的同学下船
剩下的15个同学编号为: [2, 4, 6, 8, 10, 11, 13, 15, 16, 18, 20, 22, 24, 27, 30]
```