• 五.队列的应用案例-烫手的山芋


    烫手山芋游戏介绍:6个孩子围城一个圈,排列顺序孩子们自己指定。第一个孩子手里有一个烫手的山芋,需要在计时器计时1秒后将山芋传递给下一个孩子,依次类推。规则是,在计时器每计时7秒时,手里有山芋的孩子退出游戏。该游戏直到剩下一个孩子时结束,最后剩下的孩子获胜。请使用队列实现该游戏策略,排在第几个位置最终会获胜。

    站在队头的孩子拿着山芋(谁作为队头,谁的手里边就有山芋)

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

    分析:为了模拟这个圈,我们可以使用队列。假设游戏开始时,排在队列中的第一个(队首)的孩子手里拿着山芋。游戏开始后,拿着山芋的孩子出队列然后再入队列,将山芋传递给下一个孩子。每当山芋到队首孩子手里后,队首的孩子先出队列再入队列,一次类推。当传递六次后,手里有山芋的孩子淘汰,游戏继续,继续传递山芋。

    复制代码
    class Queue():
        def __init__(self):
            self.items = []
        def enqueue(self,item):
            self.items.insert(0,item)
        def isEmpty(self):
            return self.items == []
        def dequeue(self):
            if self.isEmpty():
                return ''
            else:
                return self.items.pop()
        def size(self):
            return len(self.items)
        def travel(self):
            print(self.items)

    最基本的写法1:

    names = ['A','B','C','D','E','F']
    q = Queue()
    for name in names:
        q.enqueue(name)
    # q.travel()
    while q.size() > 1:
        for i in range(7):
    #         q.travel()
            kid = q.dequeue()
            q.enqueue(kid)
        q.dequeue()
        
    print(q.dequeue())

    能确定循环次数的用for,不能确定循环次数的用while

    函数式写法2:

    def hotPotato(namelist, num):
        simqueue = Queue()
        for name in namelist:
            simqueue.enqueue(name)
    
        while simqueue.size() > 1:
            for i in range(num):
                kid = simqueue.dequeue()
                simqueue.enqueue(kid)
    
            simqueue.dequeue()
    
        return simqueue.dequeue()
    
    print(hotPotato(["Bill","David","Susan","Jane","Kent","Brad"],7))
  • 相关阅读:
    MySql 数据备份与还原
    PHP 连接数据库
    迭代法写线性回归
    ML numpy、pandas、matplotlib的使用
    005 动态加载实例
    爬虫实现案例
    004 使用scrapy框架爬虫
    003 爬虫持久化的三个不同数据库的python代码
    内置函数和匿名函数
    迭代器和生成器
  • 原文地址:https://www.cnblogs.com/studybrother/p/11145147.html
Copyright © 2020-2023  润新知