Back to Posts

队列——约瑟夫问题

Posted in dataStruct

队列的应用

著名的约瑟夫问题:一个一世纪著名历史学家弗拉维奥·约瑟夫斯的传奇故事。故事讲的是,
他和他的 39 个战友被罗马军队包围在洞中。他们决定宁愿死,也不成为罗马人的奴隶。他们
围成一个圈,其中一人被指定为第一个人,顺时针报数到第七人,就将他杀死。 约瑟夫斯是
一个成功的数学家,他立即想出了应该坐到哪才能成为最后一人。【摘自here

使用python实现约瑟夫问题

"""
众人围一圈:
1 从一数到七;2 人来又人往;3 逢七便出局;4 直至座一人;
"""


# fixme 用队列来实现还是有些混淆,用循环队列解决试试

def josheper(players, bullet=7):
    seat = MyQueue()

    # 众人围一圈
    for player in players:
        print('玩家%s进入圈内' % player)
        seat.enqueue(player)

    # 直至座一人(为什么最后一句反而在这:结束即开始)
    while seat.size() > 1:
        # 从一数到七
        for i in range(bullet):
            # 人来又人往
            dequeue = seat.dequeue()
            print('玩家%s从圈尾出局并插入首位' % dequeue)
            seat.enqueue(dequeue)

            # 逢七便出局
        out = seat.dequeue()
        print("玩家【%s】不幸为第%s号" % (out, bullet))

    return seat.dequeue()
    
    

"""
python中的Queue更像是java的LinkedBlokingQueue;
这里用的Queue功能更单一一些,只需要先进先出的功能即可;
内部使用List做容器;
"""
class MyQueue:
    def __init__(self):
        self.item = []

    def enqueue(self, item):
        self.item.insert(0, item)

    def dequeue(self):
        return self.item.pop()

    def size(self):
        return len(self.item)

    def isEmpty(self):
        return self.item == []



print('最终存活:%s' % josheper(["张三", "李四", "王二", "麻子", "韩梅梅", "李芳芳"]))

你看那个人好像一条狗啊

Read Next

Java8的lambda