使用python实现三壶谜题的方法

  介绍

使用python实现三壶谜题的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一,算法思想

算法分析

    <李>采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。 <李>初始状态便为(8,0,0),再拓展他的下一结点的可能结构。 <李>若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(open_list)中。然后递归上述操作。 <李>直到拓展列表(open_list)为空或者找到目标为止。

思想图解

<强>这里的第一个数就代表着是那8个品脱的瓶子,依次分别是八品脱,五品脱,3品脱

使用python实现三壶谜题的方法

就如同上图一样,使用层次遍历一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止(类似于广度优先遍历),

二代码展示

1。创建树节点结构

节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:

类节点:#创建树节点
  def __init__(自我、数据):
  自我。data=https://www.yisu.com/zixun/data存储三个壶的容量状态
  自我。每=#没有存储上一时刻三个壶的容量状态

2。实现倾倒动作

由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:

 def倒(n): #扩展子节点
  r_list=n。数据#记录当前三个水壶的容量状态
  max_list=(8、5、3) #水壶的最大容量
  我,j ((0, 1), (0, 2), (1、2), (1,0)、(2,0)、(2,1)):
  如果r_list[我]!=0:
  n_list=r_list.copy() #初始化下一结点的水壶状态
  如果r_list[我]+ r_list [j]比;max_list [j]:
  n_list[我]=r_list[我]- (max_list [j], r_list [j])
  n_list [j]=max_list [j]
  其他:
  n_list [j]=r_list[我]+ r_list [j]
  n_list[我]=0
  国旗=True #记录水壶的状态是否已经发生过(扩展过)> def BFS_node (root_1): #递归查找子节点的扩展状态以及查验是否找到4品脱的水的壶
  n=root_1
  print(“当前节点:“,n.data)
  如果open_list没有:
  返回“没有找到4品脱的水“
  节点列表=n.data
  如果4节点列表:
  print(“找到了4品脱的水“)
  print_node (n)
  返回“找到了4品脱的水“
  closed_list.append (open_list.pop (0))
  倒(n)
  打印(“* * * * * * *“)
  BFS_node (open_list [0]) 

数据初始化

数据初始化,以及找到4品脱水后打印路径的打印函数。

 def print_node (n): #打印正确的水壶操作路径
  如果n。/==没有:
  返回“;“
  打印(n.data)
  print_node (n.per)
  
  
  #初始化数据
  根节点=((8,0,0))
  open_list=(根)#存储已找到却未被扩展的子节点
  closed_list=[] #存储已找到且被扩展的子节点
  BFS_node (open_list [0]) 

关于使用python实现三壶谜题的方法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

使用python实现三壶谜题的方法