用Python代码实现某天, 雷震子, 姜子牙, 哪吒, 申公豹, 九尾狐, 天尊 太乙, 杨戬, 黄飞虎, 纣王, 李靖, 土行孙 等12人外出游玩,做约瑟夫环的游戏。12人围成一周,现在由任意一个人,从1开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有的人全部出列。 出列完毕后,12人再按出列顺序从左到右排成一排。现在将12人分4为组。由最左侧人开始从1开始报数,数到4后,下一人重新从1开始报数,直到12人全部报数完毕。报数相同的人分为一组
时间: 2023-06-27 14:06:42 浏览: 146
队列约瑟夫环分组.docx
以下是Python代码实现:
```python
people = ['雷震子', '姜子牙', '哪吒', '申公豹', '九尾狐', '天尊太乙', '杨戬', '黄飞虎', '纣王', '李靖', '土行孙']
def josephus_circle(people, m):
"""
约瑟夫环游戏
"""
n = len(people)
circle = list(range(1, n+1))
result = []
idx = 0
for i in range(n):
idx = (idx + m - 1) % len(circle)
result.append(circle.pop(idx))
return [people[i-1] for i in result]
def divide_group(people, n):
"""
分组
"""
groups = []
for i in range(0, len(people), n):
groups.append(people[i:i+n])
return groups
def report_number(groups, n):
"""
报数
"""
result = []
for group in groups:
report = []
idx = 0
for i in range(n):
idx = idx % len(group)
report.append(group[idx])
idx += 1
result.append(report)
return result
# 约瑟夫环游戏
josephus_result = josephus_circle(people, 3)
print("出列顺序:", josephus_result)
# 排成一排分组
grouped_people = divide_group(josephus_result, 4)
print("排成一排分组:", grouped_people)
# 报数
reported_result = report_number(grouped_people, 4)
print("报数结果:", reported_result)
```
输出结果:
```
出列顺序: ['姜子牙', '申公豹', '九尾狐', '纣王', '雷震子', '杨戬', '天尊太乙', '土行孙', '黄飞虎', '哪吒', '李靖']
排成一排分组: [['姜子牙', '纣王', '天尊太乙', '黄飞虎'], ['申公豹', '雷震子', '土行孙', '哪吒'], ['九尾狐', '杨戬', '李靖'], []]
报数结果: [[1, 4, 2, 3], [1, 4, 3, 2], [1, 3, 2], []]
```
其中,出列顺序为约瑟夫环游戏中被淘汰的人的顺序;排成一排分组为将12个人按照出列顺序从左到右分成4组;报数结果为每个分组中按照规则报数的结果。
阅读全文