题目

给定两个水壶,一个可装4加仑水,一个能装3加仑水。水壶上没有任何度量标记。有一水泵可用来往壶中装水。

问:怎样在能装4加仑的水壶里恰好只装2加仑水?

即:初始4加仑大水壶状态(0,0);目标4加仑大水壶状态(2,?)【问号表示任意状态】

X = 大壶

Y = 小壶

根据题目可以确定每一组的操作

1(X,Y|X<4)→(4,Y)           4加仑水壶不满时,将其装满;

2(X,Y|Y<3)→(X,3)           3加仑水壶不满时,将其装满;

3(X,Y|X>0)→(0,Y)           把4加仑水壶中的水全部倒出;

4(X,Y|Y>0)→(X,0)           把3加仑水壶中的水全部倒出;

5(X,Y|X+Y≥4∧Y>0)→(4,Y-(4-X))     把3加仑水壶中的水往4加仑水壶里倒,直至4加仑水壶装满为止 ;

6(X,Y|X+Y≥3∧X>0)→(X-(3-Y),3)      把4加仑水壶中的水往3加仑水壶里倒,直至3加仑水壶装满为止;

7(X,Y|X+Y≤4∧Y>0)→(X+Y,0)     把3加仑水壶中的水全部倒进4加仑水壶里;

8(X,Y|X+Y≤3∧X>0)→(0,X+Y)     把4加仑水壶中的水全部倒进3加仑水壶里;

可能出现的操作为上面的8种情况

搜索策略:循环匹配→号左侧的情况,如果满足则进行右侧操作,直到搜索到目标状态或程序结束为止。

解决思路:采用模拟的方式遍历所有可能的结果,当找到目标则结束。其中需要记录已经搜寻过的状态,防止多次搜索同一状态陷入死循环。

大体流程:朝一个方向进行不断深入搜索,直到走到尽头,然后返回再进行搜索其他分支。(递归流程)

代码实现

# ######################################
# ##          Author:Gu-f             ##
# ##          Time:2020/02/20         ##
# ####################################### 当前大壶里面含有的水量
kettle_big = 0
# 当前小壶里面含有的水量
kettle_small = 0
# 大壶的容量
capacity_big = 4
# 小壶的容量
capacity_small = 3
# 目标大水壶水量
target_status = 2# 已经存在过的状态
old_status = [[0,0]]
# back
back_kettle_big = 0
back_kettle_small = 0# 状态备份
def back_kettle():global back_kettle_smallglobal back_kettle_bigback_kettle_big = kettle_bigback_kettle_small = kettle_small# 大小壶当前的状态
def kettle_status():global kettle_bigglobal kettle_smallstatus = [kettle_big, kettle_small]return status# 倒满大壶
def full_big():global capacity_bigglobal kettle_bigback_kettle()kettle_big = capacity_bigcheck_kettle()# 倒满小壶
def full_small():global capacity_smallglobal kettle_smallback_kettle()kettle_small = capacity_smallcheck_kettle()# 清空大壶
def clear_big():global kettle_bigback_kettle()kettle_big = 0check_kettle()# 清空小壶
def clear_small():global kettle_smallback_kettle()kettle_small = 0check_kettle()# 小壶的水注满大壶
def small_to_big():global kettle_bigglobal kettle_smallglobal capacity_bigback_kettle()kettle_small = kettle_big + kettle_small - capacity_bigkettle_big = capacity_bigcheck_kettle()# 大壶的水注满小壶
def big_to_small():global kettle_bigglobal kettle_smallglobal capacity_smallback_kettle()kettle_big = kettle_small + kettle_big - capacity_smallkettle_small = capacity_smallcheck_kettle()# 小壶的水全部倒入大壶
def small_to_big_full():global kettle_bigglobal kettle_smallback_kettle()kettle_big = kettle_small + kettle_bigkettle_small = 0check_kettle()# 大壶的水全部倒入小壶
def big_to_small_full():global kettle_smallglobal kettle_bigback_kettle()kettle_small = kettle_big + kettle_bigkettle_big = 0check_kettle()# 检查是否查找过
def check_kettle():global kettle_bigglobal kettle_smallif kettle_status() in old_status:kettle_big = back_kettle_bigkettle_small = back_kettle_smallelse:if kettle_big == target_status:print("\nFind answer!")# print(old_status,end='')old_status.append(kettle_status())print("One of the methods found:")for i in old_status:print(i,end='')print("-->",end='')print("Finish!")exit()else:old_status.append(kettle_status())find_status()# 递归查找存在可能使kettle_big = 2的情况,当查到任意一种情况后终止
def find_status():global kettle_smallglobal kettle_bigif kettle_big < capacity_big or kettle_status() == [0,0]:full_big()if kettle_small < capacity_small:full_small()if kettle_big > 0:clear_big()if kettle_small > 0:clear_small()if kettle_small + kettle_big >= capacity_big and kettle_small > 0:small_to_big()if kettle_small + kettle_big >= capacity_small and kettle_big > 0:big_to_small()if kettle_small + kettle_big <= capacity_big and kettle_small > 0:small_to_big_full()if kettle_small + kettle_big <= capacity_small and kettle_big > 0:big_to_small_full()if __name__ == '__main__':find_status()print("Not Found!")

输出结果测试

大水壶容量:4

小水壶容量:3

目标大水壶水量:2

可行方法之一如下:

======================================

大水壶容量:4

小水壶容量:3

目标大水壶水量:1

可行方法之一如下:

======================================

大水壶容量:8

小水壶容量:7

目标大水壶水量:3

可行方法之一如下:

======================================

再附加一张画的连我自己都看不懂了的解释图,因为画的太烂,所以放最后吧。。。。。

红色箭头标注的为4,3,2样例的搜索流程(也就是输出结果第一个)

水壶问题 python实现倒水操作相关推荐

  1. 人工智能 水壶问题 python解法

    人工智能 水壶问题 python解法 系列文章 人工智能 倒啤酒问题 python解法 人工智能 水壶问题 python解法 A*算法之八数码问题 python解法 A*算法之野人传教士问题 pyth ...

  2. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8

    我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...

  3. Python 炫技操作:合并字典的七种方法

    来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...

  4. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

  5. python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  6. python 实现卷积操作

    python实现卷积操作 调用tf.nn.conv2d()实现卷积 自己实现卷积函数 我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现 ...

  7. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...

    本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...

  8. python界面设置-PYTHON图形化操作界面的编程七__创建菜单

    PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...

  9. python与excel做数据可视化-Python的Excel操作及数据可视化

    Excel表操作 python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 安装xlrd pip install xlrd 简单的表格读取 ...

最新文章

  1. Android Q适配
  2. 第十一届河南省赛--H : Attack City and Capture Territory
  3. 程序中抛出空指针异常_从Java应用程序中消除空指针异常
  4. Centos7 Yum安装 PHP5.5,5.6,7.0
  5. java导出excel_纯干货:Java开源报表工具JasperReport使用
  6. java编程思想 Chapter 2
  7. 敏捷开发相关概念——学习笔记
  8. 软件工程个人日报 2016/6/29
  9. - -||计算机专业就业前景
  10. redis-LinkedList
  11. php开发人脸识别的步骤,人脸识别的流程及主要技术
  12. Unity 接入百度AI - Logo商标识别
  13. unity中显示fps
  14. Dedecms 5.7 SP2后台广告管理处getshell
  15. Medkoo Biosciences艾美捷 甲氧沙林
  16. Elment ui中el-table 实现表格拖拽
  17. 计算机底层架构(偏硬件)综述
  18. 储留香:从丞相说到文件系统
  19. 魅族手机里的便签怎么导出转移到新的手机上?
  20. 使用 TestFight 构建 Beta 测试版本

热门文章

  1. 图片识别-合成-图片滤镜等
  2. 学生成绩问题,60以下不及格,60-70及格,70-80一般,80-90良好。90-100优秀。(用if{}else{})
  3. 华为matebook14 笔记本触摸板操作
  4. Javac 不是内部或外部命令
  5. IDEA的web项目文件夹添加项目标识(蓝色小点)
  6. 桥田QT-650快换盘在FDS热熔自攻螺接工艺中的应用
  7. 学习笔记 JavaScript ES6 箭头函数
  8. mac php yaf 安装,mac下安装yaf
  9. 【蓝桥杯】《试题 基础练习 十六进制转八进制》 详解
  10. java程序设计教程与项目_Java程序设计教程与项目实训