小孩分油问python解决.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
小孩分油问python解决

1.问题描述原问题:两个小孩去打油,一个人带了一个一斤的空瓶,另一个带了一个七两一个三两的空瓶。原计划各打一斤油,可是由于所带的钱不够,只好两人合打了一斤油,可是又没有其它工具,试仅用三个瓶子(一斤、七两、三两)精确地分成两个半斤油来。2.算法设计把三个油瓶中的油量作为一个状态,经过一个合法动作后得到下一个状态(合法动作是把A瓶中的油全部倒入B瓶 或者 把A瓶中的油部分倒入B瓶使B瓶充满油),递归搜索所有的可能状态,如果到达最终状态则递归停止。油瓶中油的变化规则:(S表示3两油瓶,T表示7两油瓶)序号规则解释1(S,T) and S7 - (7,T)7两瓶不满时装满2(S,T) and T3 - (S,3)3两瓶不满时装满3(S,T) and S0 - (0,T)7两瓶不空时倒空4(S,T) and T0 - (S,0)3两瓶不空时倒空5(S,T) and S0 and S+T=3 - (0,S+T)7两瓶中的油全倒入3两瓶6(S,T) and T0 and S+T=7 - (S+T,0)3两瓶中的油全倒入7两瓶7(S,T) and S0 and S+T=3 - (S+T-3,3)7两瓶中的油倒满3两瓶8(S,T) and T0 and S+T=7 - (7,S+T-7)3两瓶中的油倒满7两瓶3.代码(穷搜索) 广度优先搜索:(文本输出)import osinitial_oil_state = [10,0,0] # 油瓶的初始状态oil_volume = [10,7,3] # 每个油瓶的对应容积from collections import deque # 导入collections标准库中的队列对象和方法# 利用python的deque队列记录状态转移情况,初始化时加入油瓶初始状态。deque是可以从头尾插入和删除的队列record = deque()record.append(initial_oil_state)# 删除文件,因为文件以追加模式打开if os.path.exists(oil_half_width_answer.txt): os.remove(oil_half_width_answer.txt)def NextStateLegal(current_state,oil_volume): next_action = [ (from_,to_) # 列表推导 # 例如[x*x for x in range(10) if x % 3 == 0]得出10以内能被3整除的数的平方构成的列表 for from_ in range(3) for to_ in range(3) if from_ != to_ and current_state[from_] 0 and current_state[to_] oil_volume[to_] ] # 通过列表推导式获得下一动作的二元组构成的列表,由(倒出油瓶编号,倒入油瓶编号)组成。 # 二重循环得到下一步的所有可能动作,然后通过 # 1.倒入倒出不能为同一个2.倒出的油瓶中必须有油3.已经满了的油瓶不能再倒入 的条件判断是否合法 for from_, to_ in next_action: # next_state = current_state ,浅复制造成错误,不该这样,或者可以导入copy使用deepcopy方法 next_state = list(current_state) if current_state[from_] + current_state[to_] oil_volume[to_]: next_state[from_] -= (oil_volume[to_]-current_state[to_]) next_state[to_] = oil_volume[to_] else: next_state[from_] = 0 next_state[to_] = current_state[to_] + current_state[from_] yield next_state # 再由所有可能的合法动作得出所有的下一个状态,通过yield产生供其它函数调用# 记录调试的变量:num表示总共实现方法数,record_list记录所有实现路径num = 0record_list = []def searchResult(record, oil_volume=[10,7,3], final_state=[5,5,0]): global num, record_list # 由record的末尾元素得到当前油瓶状态 current_state = record[-1] # 得到关于当前状态的下一状态的可迭代生成器,供下一步循环使用 next_state = Next

文档评论(0)

135****6041 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档