问题背景

首先给定两个杯子,体积分别问max_X、max_Y。杯子里当前分别有水量x、y。允许的操作有装满一个杯子、倒空一个杯子、将一个杯子中的水倒入另一个杯子。

现在想要通过这两个杯子,获取指定体积的水,需要经过哪些操作?

比如:两个杯子体积分别为90L和50L,现杯中水量为0L和0L,想要得到60L的水,需要经过哪些操作?

算法思路

  1. 假设当前水杯状态分别为(x,y)。即分别有x升水和y升水。那么只通过一步操作,写出所有可能的下一步水杯状态。
def next_step(x, y, max_X, max_Y):return {(0, y): '倒空x',(x, 0): '倒空y',(x + y - max_Y, max_Y) if x + y >= max_Y else (0, x + y): 'x倒入y中',(max_X, x + y - max_X) if y + x >= max_X else (x + y, 0): 'y倒入x中',(max_X, y): '装满x',(x, max_Y): '装满y'}
  1. 通过递归调用,寻找可能的路径
def search_solution(capacity1, capacity2, goal, start=(0, 0)):paths = [ [('init', start)] ]   explored = set() # 存放已经出现过得状态。对于已经出现过得状态,说明已经探索过了,就没必要重复探索while paths:  # 遍历所有可能的路径path = paths.pop(0)   # 取一条路径frontier = path[-1]   # 取路径最末端的节点(x, y) = frontier[-1] # 获取该节点的状态for state, action in next_step(x, y, capacity1, capacity2).items(): # 遍历该状态下,下一步所有可能的状态# ic(frontier, state, action)if state in explored: continue   # 如果下一步的状态已经探索过了,就跳过new_path = path + [ (action, state) ]  # 将下一步状态,添加到当前路径的末端if goal in state:return new_path  # 如果找到目标状态,就返回该路径else:paths.append(new_path) # 如果没找到目标状态,就将该路径添加到路径探索列表中explored.add(state)  # 并将该状态添加到已探索状态中return None
  1. 调用运行

    search_solution(90, 50, 60, (0, 0))

总结延伸

倒水问题,是一个经典的将实际问题,转化为代码的小练习。经过锻炼,逐渐熟悉python语法和算法处理,后面就可以提升难度,进入更高一个层次的算法训练了。

倒水问题python实现相关推荐

  1. 杯子倒水问题 -python

    题目:假设有两个杯子A ,B,用户只需要输入两个杯子的容量值和需要获取的杯子数值left_c.问两个杯子通过何种操作能获取到left_c 的数值. 分析:此题目是求解优化的问题.采用bfs算法. cl ...

  2. 阿里巴巴NLP算法面试题整理

    大家好,这里是面经酱- 今天来帮大家梳理网上公开面经中提到的阿里NLP算法岗相关面试题,欢迎在 面经酱(www.mjj666.cn) 搜索最新面经,有其他公司.岗位的面经梳理需求请留言哦- 今天来帮大 ...

  3. python 编程题 埃及金字塔罐子倒水

    解开了埃及金字塔修建秘密的考古队,现在准备进入金字塔内进行更深一步的考古工作,教授们在探险的过程中,发现了一道石门,石门上雕刻着斯芬克斯的神像,石门前放着两个罐子,罐子上标着数字,神像的头上用双手拖着 ...

  4. 水壶问题 python实现倒水操作

    题目 给定两个水壶,一个可装4加仑水,一个能装3加仑水.水壶上没有任何度量标记.有一水泵可用来往壶中装水. 问:怎样在能装4加仑的水壶里恰好只装2加仑水? 即:初始4加仑大水壶状态(0,0):目标4加 ...

  5. 作为一个程序员。数学重要吗,下面python大牛告诉你

    每个计算机系毕业的人,大都学过不少数学课,而且不少学校的计算机系的数学课,通常比一般的其他工科专业的数学要难一些,比如不上高等数学,而是学数学分析,不上线性代数而去上高等代数.但是,大部分毕业了后去做 ...

  6. python使用del保留字定义一个函数-Python使用什么保留字定义一个函数。

    [单选题]Where was the First Continental Congress held? [单选题]对于集合S和T,下列不属于集合类型的操作是() [判断题]UPS系统的静态开关用于保护 ...

  7. 编程语言python入门-编程语言入门(以python为例)

    1 前言 该文章以Python语言为例,讲解编程语言的框架.偏重于编程语言的框架,因此主要讲编程语言必须的通用的内容.对于Python语言的特性,不过多讲解,适合入门级选手.想要进一步深入,可以学习P ...

  8. python一只青蛙一次可以_40.细说递归之二:Python求解斐波那契数列

    本篇通过青蛙跳台阶.兔子数列(斐波那契数列)问题进一步理解递归思想的魅力. 上一篇最后的题目如下: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个n级的台阶总共有多少种跳法? 归纳 ...

  9. 狼、羊、菜、农夫过河问题 穷举 Python实现

    仍然是王晓华老师的算法课程,穷举问题中的狼.羊.菜和农夫过河问题,该问题与"三个水桶倒水"问题相似,需穷举状态,同时仍需判断动作的有效性. 状态初始值是 [left,left,le ...

  10. python命令窗口在哪里_详解如何在cmd命令窗口中搭建简单的python开发环境

    详解如何在cmd命令窗口中搭建简单的python开发环境 1.快捷键win+r输入cmd回车调出cmd界面,在命令行输入python回车,显示python命令无法识别 2.登陆python官网http ...

最新文章

  1. 你写的ML代码占多少内存?这件事很重要,但很多人还不懂
  2. 如何正确使用COCO数据集
  3. 设计模式: 自己手动实现一个观察者设计模式
  4. Android零基础入门第77节:Activity任务栈和启动模式
  5. java swing事件机制_java SWing事件调用的两种机制
  6. python xml.dom模块解析xml
  7. 使用remi安装php70,Linux下使用yum安装LNMP环境
  8. spring 注解方式配置Bean
  9. bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出
  10. 东方通 启动服务访问不到_使用金万维宽带通动态域名服务实现速达3000异地访问...
  11. python urllib3 request 无返回结果_python urllib request urlopen请求网页返回bytes类型
  12. 仿ios桌面vivo_原生万物,生态共赢丨永中移动Office为vivo文档提供定制版解决方案...
  13. matlab实现7种滤波
  14. YOLOv2论文中英文对照翻译
  15. Apache Impala 3.4.0 —— Admission Control and Query Queuing(动态资源池)实践
  16. 世界所有国家的信息(2)
  17. printvertically Java_Print Words Vertically in JavaScript
  18. oppo小布机器人_OPPO小布助手2.0强势来袭 三大版块迎来重大升级
  19. 教你在“狼人杀”中实现变声效果
  20. 『牛角书』鸿蒙——简易通讯录项目开发

热门文章

  1. 分布式事务之 LCN 框架实现方案的原理、配置与使用
  2. Logistic Regression 逻辑回归 简单易懂的笔记 by hch
  3. Mac加显示器桌面排列设置
  4. 日历控件修改的JS代码
  5. 从冲突到和谐:智能新文化环境中人机关系的伦理重构
  6. 尼尔森数据显示谷歌雅虎今夏流量均增长
  7. hive卡在最后一个reduce过不去_数据倾斜
  8. 关于U盘中“文件夹EXE病毒”的解决方案
  9. 通过两台交换机级联来连接多台设备
  10. 雪鹰领主手游战力提升辅助攻略 雪鹰领主手游脚本工具介绍