0
点赞
收藏
分享

微信扫一扫

【Python】约瑟夫斯问题——经典的队列

窗外路过了谁 2022-02-06 阅读 36
python

据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?

众所周知,Python中的队列是以FIFO方式来管理数据的,因此我们只要合理使用队列所带的方法就可以很轻松的解决这个问题

代码如下:

from pythonds.basic import Queue


def josephus(namelist, num):
    queue = Queue()
    for name in namelist:
        queue.enqueue(name)

    while queue.size() > 1:
        for i in range(num):
            queue.enqueue(queue.dequeue())
        queue.dequeue()

    return queue.dequeue()


s = list(map(str, input('请在下方按所需顺序依次输入名字:\n').split(', ')))
n = eval(input())
print(josephus(s, n))

接下来,你将得到如下效果:

请在下方按所需顺序依次输入名字:
Jerry, Hugo, Douglas, Brian, Aaron, Tom, Edward
7
Brian

进程已结束,退出代码为 0
举报

相关推荐

0 条评论