约瑟夫问题

Posted wintalau

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫问题相关的知识,希望对你有一定的参考价值。

  在古罗马人占领乔塔帕特后,39个犹太人与约瑟夫和他的朋友躲到一个洞中。39个犹太人决定宁死也不被敌人抓到,于是商定以一种特殊的方式自杀:

  41个人排成一个圆圈,由第一个人开始报数,每报数到3的人就必须自杀,直到所有人都自杀身亡为止。

  但是约瑟夫和他的朋友并不想死,那么请问,约瑟夫和他的朋友,应该怎样安排自己的位置,才能逃过一劫?

  分析:如果约瑟夫和他的朋友不想死,那么他们将是最后剩下的两个人,因此,问题的关键在于如何安排他们的位置,才能将他们留到最后。

def move(man, sep):
    """
        将man列表向左移动sep单位,最左边的元素向列表后面添加,
        相当于队列顺时针移动
    """
    for i in range(sep):
        item = man.pop(0)
        man.append(item)

def play(man=41, sep=3, rest=2):
    """
        man:玩家个数
        sep:杀死数到的第几个人
        rest:幸存者数量
    """
    print(f总共man个人,每报数数到第sep的人自杀, 最后剩余rest个人)
    man = [i for i in range(1, man + 1)]    # 初始化玩家列队
    print(玩家列队:, man)
    sep -= 1    # 数两个数,到第3个人时就自杀
    while len(man) > rest:
        move(man, sep)    # 执行数数操作
        print(kill, man.pop(0))    # 数到尾数的人自杀,将其移除列队
    return man
servive = play()
print(最后逃生的人编号是:, servive)

输出结果:

总共41个人,每报数数到第3的人自杀, 最后剩余2个人
玩家列队: [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, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
kill 3
kill 6
kill 9
kill 12
kill 15
kill 18
kill 21
kill 24
kill 27
kill 30
kill 33
kill 36
kill 39
kill 1
kill 5
kill 10
kill 14
kill 19
kill 23
kill 28
kill 32
kill 37
kill 41
kill 7
kill 13
kill 20
kill 26
kill 34
kill 40
kill 8
kill 17
kill 29
kill 38
kill 11
kill 25
kill 2
kill 22
kill 4
kill 35
最后逃生的人编号是: [16, 31]

因此,如果约瑟夫和他的朋友如果想要逃生,就得把自己和朋友放到第16和第31个位置上,以保证他们是最后的两个玩家

 

以上是关于约瑟夫问题的主要内容,如果未能解决你的问题,请参考以下文章

约瑟夫问题

约瑟夫环问题

用ArrayList(解决约瑟夫问题)

1139 约瑟夫环问题

Musical Chairs(约瑟夫环问题)

约瑟夫问题