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

相关文章
相关标签/搜索