Python约瑟夫生死游戏

有一艘般上有40个人,由于触礁出现了漏水,现在船上最多只能载20个人,需要20个人下船。于是这40个人排成一队,根据站位,每个人领取了一个编号,从1开始到40。然后从1开始到9进行循环报数,报数为9的人出列下船,一直循环,直到船上只剩下20人。

示例:1 2 3 4 5 6 7 8 9 10 11....40

第一次下船的编号为9(1,2,3...编号为9的人报9)

第二次下船的编号为18(10的人报1...18的人报9)

第三次下船的编号为27(19的人报1...27的人报9)

。。。。。

请问最后哪些编号的人下船了?

方法一: 

persons = list(range(1,41))
index = 1 # 报数从1开始
persons_index = 0 # 索引从0开始
persons_num = 40 # 总人数
while persons_num > 20: # 大于一半的人,才进入循环
    persons_index +=1 # 索引加1
    if persons_index == 40: # 判断索引号是不是最后一位
        persons_index = 0 # 是最后一位,就从头开始
    if persons[persons_index] == 0: # 判断列表元素的值是不是0,是0就结束本次循环
        continue
    else:
        index +=1 # 报数加1
        if index % 9 == 0: # 判断报数是否为9的倍数
            persons[persons_index] = 0 # 为9的倍数就用0替换元素值
            persons_num -= 1 # 总人数减1
            print(f'{persons_index+1}号下船了',end='  ') # 打印出下船的人
# 留在船上的人,因为for循环内删除元素后会超出范围
# 所以要新建个列表,把大于0的编号放到新列表内
new_persons = []
for i in persons:
    if i > 0:
        new_persons.append(i)
print('留在船上人的编号为:{}'.format(new_persons))

 方法二:

def del_person(persons,persons_num,step):
    while len(persons) > persons_num: # 人数超过一半的时候进入循环
        print(f'{persons[step-1]}号下船了',end='   ') # 打印下船的编号
        persons.pop(step-1) # 删除报数到9的人
        persons = persons + persons[:step-1] # 把前8位添加到列表末尾
        del persons[:step-1] # 删除前8位
    persons.sort() # 将列表进行排序
    print(f'留在般上人的编号为:{persons}')
persons = list(range(1,41))
del_person(persons,20,9)

运行结果:

9号下船了  18号下船了  27号下船了  36号下船了  5号下船了  15号下船了  25号下船了  35号下船了  6号下船了  17号下船了  29号下船了  40号下船了  12号下船了  24号下船了  38号下船了  11号下船了  26号下船了  1号下船了  16号下船了  32号下船了  留在船上人的编号为:[2, 3, 4, 7, 8, 10, 13, 14, 19, 20, 21, 22, 23, 28, 30, 31, 33, 34, 37, 39]

 

Guess you like

Origin blog.csdn.net/weixin_40611700/article/details/120429944