python实现三壶谜题的示例详解
作者:仙九玖玖 发布时间:2021-12-09 19:56:15
标签:python,三壶谜题
目录
前言
一、算法思想
算法分析
思想图解
二、代码展示
1.创建树节点结构
2.实现倾倒动作
主递归函数
数据初始化
总结
前言
有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。
一、算法思想
算法分析
采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。
初始状态便为[8,0,0],再拓展他的下一结点的可能结构。
若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(open_list)中。然后递归上述操作。
直到拓展列表(open_list)为空或者找到目标为止。
思想图解
这里的第一个数就代表着是那个8品脱的瓶子,依次分别是8品脱,5品脱,3品脱
就如同上图一样,使用层次遍历一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止(类似于广度优先遍历)。
二、代码展示
1.创建树节点结构
节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:
class node: # 创建树节点
def __init__(self, data):
self.data = data # 存储三个壶的容量状态
self.per = None # 存储上一时刻三个壶的容量状态
2.实现倾倒动作
由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:
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])
来源:https://blog.csdn.net/qq_41580347/article/details/109428704


猜你喜欢
- php二分查找示例二分查找常用写法有递归和非递归,在寻找中值的时候,可以用插值法代替求中值法。当有序数组中的数据均匀递增时,采用插值方法可以
- 一、下载MySQL msi版本下载地址:https://dev.mysql.com/downloads/mysql/二、安装直接右击点击安装
- 本文主要介绍了Python通过tkinter实现百度搜索的示例代码,分享给大家,具体如下:"""百度搜索可视化
- asp程序出错后,错误提示不是很清楚明白,让人摸不着头脑,用下面方法看看有没有帮助(此法目前只适合除ADO错误外的错误) &nb
- 目录Slice(切片)基于数组生成切片切片修改切片声明Append切片元素循环Slice(切片)切片和数组类似,可以把它理解为动态数组。切片
- 问题:python2.7 查询或者插入中文数据在mysql中的时候出现中文乱码---可能情况:1.mysql数据库各项没有设置编码,默认为&
- 文字的多行处理在dom元素中很好办。但是canvas中没有提供方法,只有通过截取指定字符串来达到目的。那么下面就介绍我自己处理的办法:wxm
- 一.创建正则表达式1.re模块 所有python的正则表达式都在re模块中,使用时导入import rere模块的compile(
- 当鼠标移动上去后,字慢慢的变大的 效果应该 如果实现啊<!DOCTYPE html PUBLIC "-//W3C//DTD
- 本文实例为大家分享了vue实现滑动验证条的具体代码,供大家参考,具体内容如下效果代码VerifySlider.vue<template
- 一、Flask蓝图目录我们之前写的Flask项目都是自己组织的目录结构,其实Flask官方有其推荐的目录结构,以下就是一个符合官方推荐的Fl
- 记录win10下安装两个MySQL5.6.35数据库,具体如下环境: OS:window10 DB:MYSQL5.6.35免安装版1.正常安
- JS脚本语言的基础语法:输出语法 alert("警告!"); confirm("确定吗
- 实现网页的键盘输入操作from selenium.webdriver.common.keys import Keys * 页有时需要将鼠标
- 今天看了一下数据结构的书,发现其实数据结构没有几种,线性表,数组,字符串,队列和栈,等等,其实是一回事,然后就是树结构,图结构。数据结构的理
- 创建一些工具创建工具是帮助他人的一种很好的方式,而且不用考虑太多复杂的问题或 API 设计。你可以开发一个你最喜欢的框架或平台的模板。你可以
- 如下例data2[‘营业成本率'] = data2[‘营业成本本年累计']/data2[‘营业收入本年累计']*10
- Anaconda安装安装步骤:1、官网下载安装包:https://www.anaconda.com/distribution/2、运行并选择
- 如何制作一个倒计时的程序? 见下:<%CountdownDate = #1/1
- 1. 环境准备1.1 安装pillow 和 pytesseractpython模块库需要 pillow 和 pytesseract 这两个库