介绍算法分析
使用python实现三壶谜题的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
一,算法思想
算法分析
- <李>采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。李> <李>初始状态便为(8,0,0),再拓展他的下一结点的可能结构。李> <李>若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(open_list)中。然后递归上述操作。李> <李>直到拓展列表(open_list)为空或者找到目标为止。李>
思想图解
<强>这里的第一个数就代表着是那8个品脱的瓶子,依次分别是八品脱,五品脱,3品脱强>
就如同上图一样,使用层次遍历一次一次递归扩展新的结点,知道找到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实现三壶谜题的方法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。