约瑟夫生死者小游戏

"""
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)

 执行结果:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值