1. 程式人生 > 其它 >佇列的應用案例-燙手的山芋

佇列的應用案例-燙手的山芋

5.佇列的應用案例-燙手的山芋
燙手山芋遊戲介紹:6個孩子圍城一個圈,排列順序孩子們自己指定。第一個孩子手裡有一個燙手的山芋,需要在計時器計時1秒後將山芋傳遞給下一個孩子,依次類推。規則是,在計時器每計時7秒時,手裡有山芋的孩子退出遊戲。該遊戲直到剩下一個孩子時結束,最後剩下的孩子獲勝。請使用佇列實現該遊戲策略,排在第幾個位置最終會獲勝。

  - 這個遊戲相當於著名的約瑟夫問題,一個一世紀著名歷史學家弗拉維奧·約瑟夫斯的傳奇故事。故事講的是,他和他的 39 個戰友被羅馬軍隊包圍在洞中。他們決定寧願死,也不成為羅馬人的奴隸。他們圍成一個圈,其中一人被指定為第一個人,順時針報數到第七人,就將他殺死。約瑟夫斯是一個成功的數學家,他立即想出了應該坐到哪才能成為最後一人。

分析:為了模擬這個圈,我們可以使用佇列。假設遊戲開始時,排在佇列中的第一個(隊首)的孩子手裡拿著山芋。遊戲開始後,拿著山芋的孩子出佇列然後再入佇列,將山芋傳遞給下一個孩子。每當山芋到隊首孩子手裡後,隊首的孩子先出佇列再入佇列,一次類推。當傳遞六次後,手裡有山芋的孩子淘汰,遊戲繼續,繼續傳遞山芋。

複製程式碼
from basic.queue import Queue

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))