使用python实现三壶谜题的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
这里的第一个数就代表着是那个8品脱的瓶子,依次分别是8品脱,5品脱,3品脱
就如同上图一样,使用层次遍历一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止(类似于广度优先遍历)。
节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:
class node: # 创建树节点
def __init__(self, data):
self.data = data # 存储三个壶的容量状态
self.per = None # 存储上一时刻三个壶的容量状态
由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:
def pour(n): # 扩展子节点
r_list = n.data # 记录当前三个水壶的容量状态
max_list = [8, 5, 3] # 水壶的最大容量
for i, j in ((0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)):
if r_list[i] != 0:
n_list = r_list.copy() # 初始化下一结点的水壶状态
if r_list[i] + r_list[j] > max_list[j]:
n_list[i] = r_list[i] - (max_list[j] - r_list[j])
n_list[j] = max_list[j]
else:
n_list[j] = r_list[i] + r_list[j]
n_list[i] = 0
flag = True # 记录水壶的状态是否已经发生过(扩展过)
for one in closed_list:
if one.data == n_list: # 比较当前水壶状态和以往记录过得水壶状态
flag = False
if flag:
print("扩展的新节点是:",n_list)
new_node = node(n_list) # 创建新节点存储水壶的新状态
new_node.per = n
open_list.append(new_node)
查看当前是否已经扩展到4品脱的水或者是否还有结点可以扩展。
def BFS_node(root_1): # 递归查找子节点的扩展状态以及查验是否找到4品脱的水壶
n = root_1
print("当前节点:",n.data)
if open_list is None:
return "没有找到4品脱的水"
nodelist = n.data
if 4 in nodelist:
print("找到了4品脱的水")
print_node(n)
return "找到了4品脱的水"
closed_list.append(open_list.pop(0))
pour(n)
print("*******")
BFS_node(open_list[0])
数据初始化,以及找到4品脱水后打印路径的打印函数。
def print_node(n): # 打印正确的水壶操作路径
if n.per == None:
return ""
print(n.data)
print_node(n.per)
# 初始化数据
root = node([8, 0, 0])
open_list = [root] # 存储已找到却未被扩展的子节点
closed_list = [] # 存储已找到且被扩展的子节点
BFS_node(open_list[0])
关于使用python实现三壶谜题的方法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。