给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水
给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水。
(1)定义状态空间
只关心水壶所装水的多少,可将问题进行抽象,
用数偶(X,Y)来表示:
X表示4升水壶中所装水量,X ∈ [ 0 , 4 ];
Y表示3升水壶中所装水量,Y ∈ [ 0 , 3 ];
初始状态,( 0 , 0 );
目标状态,( 2 , 0 ) 或(2,1)或(2,2)或(2,3);
(2)确定一组操作
R0:(X,Y)→(X,Y)
空操作
R1:(X,Y | X < 4) →(4,Y)
4 升水壶不满时,将其装满。
R2:(X,Y | Y < 3) →(X,3)
3 升水壶不满时,将其装满。
R3:(X,Y | X > 0) →(0,Y)
把 4 升水壶中的水全部倒出。
R4:(X,Y | Y > 0) →(X,0)
把3升水壶中的水全部倒出。
R5:(X,Y | X + Y ≥ 4 ∧ Y > 0) →(4,Y -(4 - X))
把 3 升水壶中的水往 4 升,水壶里倒,直至 4 升水壶装 满为止。
R6:(X,Y | X + Y ≥ 3 ∧ X > 0) →(X -(3 - Y),3)
把 4 升水壶中的水往 3 升,水壶里倒,直至 3 升水壶装 满为止。
R7:(X,Y | X + Y ≤ 4 ∧ Y > 0) →(X + Y,0)
把 3 升水壶中的水全部倒进,4 升水壶里。
R8: X,Y | X + Y ≥ 3 ∧ X > 0) →(0,X + Y)
把 4 升水壶中的水全部倒进,3升水壶里。
(3)搜索算法的简要描述(采用深度优先搜算)
搜索树剪枝的一个基本原则就是:一个节点只 能出现一次
public class Main {static int count_finish = 0; //记下第几个解决方案static Pot[] str = new Pot[1000];static boolean[][] water = new boolean[5][4];//描述状态是否已经访问的数组public static void main(String[] args) {solve();dfs(1);}public static void solve() {for (int k = 0; k <= 4; k++) { //状态清零for (int j = 0; j <= 3; j++) {water[k][j] = false;}}str[0] = new Pot(0, 0, 0, -1);water[0][0] = true;for (int i = 1; i < 100; i++) {str[i] = new Pot();}}private static void dfs(int k) {int x = str[k - 1].getX();int y = str[k - 1].getY();if (x < 4) {//4 升水壶不满时,将其装满。x = 4;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 1, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (y < 3) {//3 升水壶不满时,将其装满y = 3;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 2, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (x > 0) {//把 4 升水壶中的水全部倒出。x = 0;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 3, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (y > 0) {//把 3 升水壶中的水全部倒出。y = 0;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 4, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (x + y >= 4 && y >= 3) {//把 3 升水壶中的水往 4 升,水壶里倒,直至 4 升水壶装 满为止。y = y - (4 - x);x = 4;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 5, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (x + y >= 3 && x > 0) {//把 4 升水壶中的水往 3 升,水壶里倒,直至 3 升水壶装 满为止。x = x - (3 - y);y = 3;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 6, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (x + y <= 4 && y > 0) {//把 3 升水壶中的水全部倒进,4 升水壶里。x = x + y;y = 0;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 7, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}if (x + y <= 3 && x > 0) {//把 4 升水壶中的水全部倒进,3升水壶里。y = x + y;x = 0;if (water[x][y] == false) {water[x][y] = true;str[k].SetPot(x, y, 8, k - 1);if (x == 2) {output(k);return;}dfs(k + 1);water[x][y] = false;}x = str[k - 1].getX();y = str[k - 1].getY();}}private static void output(int k) { //成功找到一个解决方案,打印出来count_finish++;System.out.println("第" + count_finish + "种解决方案:");System.out.println("4加仑水壶" + "\t3加仑水壶" + "\t所使用的操作");for (int i = 0; i <= k; i++) {System.out.println("\t" + str[i].getX() + "\t\t\t" +str[i].getY() + "\t\t\t" + str[i].getOp());}}
}```public class Pot {private int X;//4加仑水壶的水量private int Y;//3加仑水壶的水量private int op;//对应操作private int father;//父节点public int getFather() {return father;}public void setFather(int father) {this.father = father;}public int getX() {return X;}public void setX(int x) {X = x;}public int getY() {return Y;}public void setY(int y) {Y = y;}public int getOp() {return op;}public void setOp(int op) {this.op = op;}public Pot(int x, int y, int op, int father) {X = x;Y = y;this.op = op;this.father = father;}public Pot() {}public void SetPot(int x, int y, int op, int father) {X = x;Y = y;this.op = op;this.father = father;}
}
给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水相关推荐
- 倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution
倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution 这个问题我找了百度,发现没有比较好的代码,有一些只判断 ...
- 给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串...
1 /* 2 * 给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串,其实也就是变位词问题 3 * 比如说 a='abc' b='acb'是可以通过a变成b的 4 * 思路; 5 ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
1.给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...
- PAT1023 组个最小数给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小例如:给定两个0两个1三个5一个8得到的数字就是10015558
1023 组个最小数 (20 分) 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 ...
- 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...
2019独角兽企业重金招聘Python工程师标准>>> EXAMPLE Input: DAMP, LIKE Output: DAMP -> LAMP -> LIMP -& ...
- LeetCode||有效的字母异位词(排列)--给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
原题链接:https://leetcode-cn.com/problems/valid-anagram 题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示 ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。...
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 找不同(给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。)
给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...
- 效用分析 ( 效能分析、Power analysis)是什么?效用分析在线计算器介绍(分析样本量、效用和效应量之间的关系时,需要把其中一个因素固定,计算另外两个因素间的关系、或者给定两个因素计算第三个
效用分析 ( 效能分析.Power analysis)是什么?效用分析在线计算器介绍(分析样本量.效用和效应量之间的关系时,需要把其中一个因素固定,计算另外两个因素间的关系.或者给定两个因素计算第三个 ...
- 天命数 描述 给定两个数字n与m(n,m均不为0,均在100,000以内), 天命数规则如下:给出一个特殊的数字k,1<=k<=3,当k=1的时候,天命数就是n,m中较大的数字整除较小的数字所得到的
一.题目 满分代码 天命数 描述 给定两个数字n与m(n,m均不为0,均在100,000以内), 天命数规则如下:给出一个特殊的数字k,1<=k<=3,当k=1的时候,天命数就是n,m中较 ...
最新文章
- poj1985 Cow Marathon(树的直径#入门)
- QTP和WinRunner区别
- 常用MySQL数据库命令总结
- 解决公司服务器加入域中不能启动应用系统的问题
- LintCode—链表倒数第n个节点(166)
- 数据结构期末考题总结(附答案)
- mysql 中文脱敏_怎样选择数据库脱敏系统?
- 电源技术中的onsemi ESD5B5.0ST1G,ESD9B3.3ST5G,ESD9B5.0ST5G,SZESD9B5.0ST5G,ESD静电保护管 TVS管 电容值低,反应速度快的解决方案
- 论文阅读--SAP-SSE: Protecting Search Patterns and Access Patterns in Searchable Symmetric Encryption
- MediaRecorder之视频录制
- 德怀特·艾森豪威尔(1890-1969)美国第34任总统,陆军五星上将。
- flask自定义过滤器,flash,form表单
- 解决网易mumu启动失败问题
- Atomic类如何保证原子性
- Typora基本使用及快捷键
- 樱陀花园10月份活动策划
- 讨论主题:人工智能对人类社会发展的影响(弊大于利)
- 秒变黑科技的高效电脑软件,请低调收藏!
- adb push与adb pull
- 浪潮nf5280m5使用U盘安装win2012
热门文章
- java twaver_《TWaver Java开发手册》.pdf
- Linux网卡驱动(4)—DM9000网卡驱动程序完全分析
- Windows程序设计之WinAPI详解程序
- SAP FICO 第三节 BDC和LTMC导入S4财务科目
- ios visio流程图_Mac下有如Visio一样好用的流程图软件吗?
- RT-Thread硬件测试(一)—— 485串口测试
- 程序员面试必看32道经典逻辑推理题
- 【HTML】HTML浏览器打印自定义页眉页脚
- scratch 游戏html5,scratch3转换为html5
- 微信小程序开发之视频上传