"""
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
"""
# 网友参考算法:
people = list(range(30))
while len(people) > 15:
i = 1
while i < 9:
people.append(people.pop(0))
i += 1
print('{:2d}号下船了'.format(people.pop(0)))
"""
2019/3/10 0:15 自己实现
思路:
1.首先思索:若让你去解决,思路是什么,具体实现步骤又是什么?
a.共30人,15人需下船,则需循环操作15次,每次从1数到9,便让一人下船
b.每次操作,过程基本类似:确定起始索引(不包括),往后数9人,数到9的那人索引值标记为-1
控制索引循环读取:每次数数时,首先判断起始索引,若起始索引为最后一个元素,数的下一人索引是多少?---->0
被标记需要下船者的处理:起始索引是多少?那往后数一个人,他的索引应该是index + 1,若值为-1,则略过不统计
2.将步骤让电脑去模拟实现
Python 约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
1,2,3,4,5,6,7,8,9(),10,11,12,13,14,15,16,17,18(),19,20,21,22,23,24,25,26,27(),28,29,30
执行结果:
共30人,编号:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
编号:9 下船了
编号:18 下船了
编号:27 下船了
编号:6 下船了
编号:16 下船了
编号:26 下船了
编号:7 下船了
编号:19 下船了
编号:30 下船了
编号:12 下船了
编号:24 下船了
编号:8 下船了
编号:22 下船了
编号:5 下船了
编号:23 下船了
幸存者编号: [1, 2, 3, 4, 10, 11, 13, 14, 15, 17, 20, 21, 25, 28, 29]
"""
index = -1
peples = [i for i in range(1, 31)] # 索引编号[1,30]
print('共30人,编号:%s' % peples)
for i in range(15): # 操作15次,15人下船
count = 0 # 每轮初始化个数0,往后数9个人
while True: # 循环次数未知,需数9个人
# 这个判断必须放在前面,若放在后面,peples[index + 1]可能越界异常
# 若从该位置(不包括)开始数9人,数的第一个人索引应该是0,故设置索引为-1
if index == len(peples) - 1:
index = -1
# 从该位置数,数的第一个数索引下标应该是index + 1,若为-1(需下船),则跳过(索引还需累加)
if peples[index + 1] == -1:
index += 1
continue
index += 1
count += 1
if count == 9: # 本轮已经数到9人,停止
break
peples[index] = -1 # 将需要下船的索引值设置为-1(不删除)
print('编号:%d 下船了' % (index + 1))
peples2 = [item for item in peples if item != -1]
print('幸存者编号:', peples2)
执行结果: