Python數據結構與算法——熱土豆問題(隊列應用1)



點擊上方 藍字 關注咱們


熱土豆(約瑟夫問題)python


問題描述:算法

熱土豆問題即「擊鼓傳花」的土豆版本,全部人圍坐一圈傳遞熱土豆,鼓聲中止,淘汰此刻拿着土豆的人,而後繼續傳遞……






小故事——約瑟夫問題
微信













算法一(逆向思惟)
數據結構


利用隊列實現熱土豆問題,參加遊戲的人名列表name_list,每一次傳遞土豆的次數num,返回最後剩下的人名便可
flex


算法(利用隊列實現)spa

利用 隊列實現熱土豆問題,模擬程序採用隊列存放全部參加的人名,並按照土豆傳遞的方向從隊首到隊尾排列(隊首始終是拿着土豆的人)
  • 反向思惟:土豆不動,人動
  • 隊首出隊再入隊:表明傳遞了一次
  • 傳遞num次後,隊首的人名直接移除



代碼
class Queue(): """隊列""" def __init__(self): self.items = []
def dequeue(self): return self.items.pop()
def enqueue(self, item): self.items.insert(0, item)
def size(self): return len(self.items)
def isEmpty(self): return self.items == []
def hotPotato(name_list, num): """逆向思惟:土豆不動,人動""" name_queue = Queue() # 存儲人名 for name in name_list: """將人名排入隊列中""" name_queue.enqueue(name)
while name_queue.size() > 1: for i in range(num): name_queue.enqueue(name_queue.dequeue()) # 完成了一次離隊入隊(傳遞) i += 1
name_queue.dequeue()
    return name_queue.dequeue()





算法二(正向思惟).net


算法描述(我的想法)
上一個算法思路來自於北京大學公開課《Python數據結構與算法》,如下爲我的想法,利用正向思惟模式即不使用隊列,直接使用 列表

人不動,直接傳遞土豆。但要注意於土豆的傳遞是從上一次刪除人名的位置再開始,而且有可能超出列表長度,故要利用索引進行重定向

代碼
def hotPotato2(name_list, num): """正向思惟:人不動,土豆動""" remainder = 0 # remainder對應的就是索引 while len(name_list) > 1: remainder += num % len(name_list) # remainder對應的就是索引 if remainder >= len(name_list): remainder = remainder - len(name_list) del name_list[remainder]  return name_list.pop()

別忘了點個在看哦!轉發那就太好了!code




本文分享自微信公衆號 - 小楊的python之路(gh_6ba152d49331)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。orm

相關文章
相關標籤/搜索