算法-约瑟夫环问题——python实现

Hello NanFeng
遇到了一个有点意思的题:

一艘船上有30个人,现在因为超载需要15人下船,决策者采用了一种很特殊的抽签方式
1.先让人们排成一列,按照顺序给每个人编号
2.依次从1开始报数,数到7的人下船
3.有人下船后,从下船之人原来的位置下一个开始重新报数
4.这样一直重复这个步骤,直到船上剩下15人
请问哪些编号的人下船了,并告知下船顺序,以及最后哪些人留了下来

其实这本质上就是经典的约瑟夫环问题。

约瑟夫环问题

背景:故事源自著名犹太历史学家Josephus,在罗马人占领乔塔帕特后,39个犹太人与Josephus以及他的朋友躲进了一个山洞中,39个犹太人决定宁死不屈,于是决定了一个自杀方式,41个人排成一个圈,由第一个人开始报数,每数到3此人就自杀,然后由下一个重新报数,直到所有人都自杀为止。然而Josephus和他的朋友并不想这就死去,于是Josephus让他的朋友和他佯装遵从,他偷偷将朋友和自己安排在第16个和31个位置,最终逃过了这场死亡游戏。

python实现

我们只需要关注三个参数:
1.人的总数:total_nums
2.出局数值:step
3.需要出局的人数:out_nums

所以我们可以直接写出一个约瑟夫环问题的通用解法

def Josephus_dead_game(total_nums, step, out_nums):
    queue = list(range(1, total_nums + 1))
    cur_out_nums = 0
    while cur_out_nums < out_nums:
        print(f'{
     queue[step-1]} is out')
        queue = queue[step:] + queue[:step - 1]
        cur_out_nums += 1
    queu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值