Python实现【约瑟夫环】问题(详细解析)

题目:

有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。输出最后站位,用1表示是基督徒,0表示非基督徒;

​def josephus_survivor(total_people, count_to_kill):
    circle = [1] * total_people # 初始化,1表示基督徒,0表示非基督徒(初始状态下所有人都是基督徒)
    survivor = [] # 用于存储幸存者的位置
    index = 0 # 从第一个人开始报数
    
    for i in range(n - 15):  # 扔掉15个人
        count = 0 #用于计数报数
        while count < count_to_kill:  # 当count小于count_to_kill时执行以下程序
            if circle[index] == 1: # 如果circle列表中的值为1,表示当前位置的人是基督徒 
                count += 1 # 统计报数
            index = (index + 1) % total_people # 移动index到下一个位置,使用模运算确保循环
        index = (index - 1) % total_people  # 循环结束时多走了一步,需要回退
        circle[index] = 0 # 将当前位置的值设为0,表示当前位置的人被扔掉
        survivor.append(index) # 将幸存者的位置添加到survivor列表中
    
    return circle # 返回经过处理后的circle列表

total_people = 30  # 总人数
count_to_kill = 9   # 报数到k的人被扔掉

result = josephus_survivor(total_people, count_to_kill) # 调用josephus_survivor函数
print(result)

#结果:
#[1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0]

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值