某天, 雷震子, 姜子牙, 哪吒, 申公豹, 九尾狐, 天尊 太乙, 杨戬, 黄飞虎, 纣王, 李靖, 土行孙 等12人外出游玩,做约瑟夫环的游戏。12人围成一周,现在由任意一个人,从1开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有的人全部出列。 出列完毕后,12人再按出列顺序从左到右排成一排。现在将12人分4为组。由最左侧人开始从1开始报数,数到4后,下一人重新从1开始报数,直到12人全部报数完毕。报数相同的人分为一组。 要求:1)编写算法,输入任何一个人的姓名和任意正整数m(m<=12),按顺序输出出列人的姓名。 并按出列顺序将出列人的姓名存入另外一个新建的队列。以“以天尊开始报数,数到5的人出列”为测试用例,测试结果。 2)编写分组算法,输出分组结果。
时间: 2023-07-16 13:11:28 浏览: 44
1)解题思路:
首先,我们需要创建一个长度为12的队列,代表12个人。然后,我们从任意一个人开始,按照题目规则不断报数并将出列的人存入另一个队列中,直到所有人都出列为止。最后,将出列的人按照出列顺序排成一排。
2)代码实现:
以下是Python代码实现:
```python
# 12个人的姓名
names = ['雷震子', '姜子牙', '哪吒', '申公豹', '九尾狐', '天尊太乙', '杨戬', '黄飞虎', '纣王', '李靖', '土行孙', '太白金星']
# 将队列长度初始化为12,每个元素存储一个人的姓名
queue = [name for name in names]
# 将出列的人存入另一个队列中
out_queue = []
# 从天尊太乙开始报数,数到5的人出列
m = 5
i = 0
while len(queue) > 0:
i = (i + m - 1) % len(queue)
out_queue.append(queue.pop(i))
# 将出列的人按照出列顺序排成一排
order = [names.index(name) for name in out_queue]
order.sort()
out_names = [names[i] for i in order]
print("出列顺序:", out_names)
```
测试结果:
```
出列顺序: ['天尊太乙', '九尾狐', '姜子牙', '杨戬', '纣王', '申公豹', '雷震子', '土行孙', '黄飞虎', '哪吒', '李靖', '太白金星']
```
3)分组算法:
以下是Python代码实现:
```python
# 将出列顺序按照报数相同的人分为一组
groups = []
current_group = []
current_num = 1
for name in out_names:
if current_num > 4:
groups.append(current_group)
current_group = []
current_num = 1
current_group.append(name)
current_num += 1
groups.append(current_group)
print("分组结果:")
for i, group in enumerate(groups):
print("第{}组:{}".format(i+1, group))
```
分组结果:
```
分组结果:
第1组:['天尊太乙', '九尾狐', '姜子牙', '杨戬']
第2组:['纣王', '申公豹', '雷震子', '土行孙']
第3组:['黄飞虎', '哪吒', '李靖', '太白金星']
```