给定两个水壶,一个可以装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升水相关推荐

  1. 倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution

    倒水问题:给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水,如果可以,输出步骤,如果不可以,输出no solution 这个问题我找了百度,发现没有比较好的代码,有一些只判断 ...

  2. 给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串...

    1 /* 2 * 给定两个字符串,确定其中一个字符串的字符重新排列后,能否变成另一个字符串,其实也就是变位词问题 3 * 比如说 a='abc' b='acb'是可以通过a变成b的 4 * 思路; 5 ...

  3. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

    1.给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...

  4. PAT1023 组个最小数给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小例如:给定两个0两个1三个5一个8得到的数字就是10015558

    1023 组个最小数 (20 分) 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 ...

  5. 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...

    2019独角兽企业重金招聘Python工程师标准>>> EXAMPLE Input: DAMP, LIKE Output: DAMP -> LAMP -> LIMP -& ...

  6. LeetCode||有效的字母异位词(排列)--给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词

    原题链接:https://leetcode-cn.com/problems/valid-anagram 题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示 ...

  7. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。...

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  8. 找不同(给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。)

    给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...

  9. 效用分析 ( 效能分析、Power analysis)是什么?效用分析在线计算器介绍(分析样本量、效用和效应量之间的关系时,需要把其中一个因素固定,计算另外两个因素间的关系、或者给定两个因素计算第三个

    效用分析 ( 效能分析.Power analysis)是什么?效用分析在线计算器介绍(分析样本量.效用和效应量之间的关系时,需要把其中一个因素固定,计算另外两个因素间的关系.或者给定两个因素计算第三个 ...

  10. 天命数 描述 给定两个数字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中较 ...

最新文章

  1. poj1985 Cow Marathon(树的直径#入门)
  2. QTP和WinRunner区别
  3. 常用MySQL数据库命令总结
  4. 解决公司服务器加入域中不能启动应用系统的问题
  5. LintCode—链表倒数第n个节点(166)
  6. 数据结构期末考题总结(附答案)
  7. mysql 中文脱敏_怎样选择数据库脱敏系统?
  8. 电源技术中的onsemi ESD5B5.0ST1G,ESD9B3.3ST5G,ESD9B5.0ST5G,SZESD9B5.0ST5G,ESD静电保护管 TVS管 电容值低,反应速度快的解决方案
  9. 论文阅读--SAP-SSE: Protecting Search Patterns and Access Patterns in Searchable Symmetric Encryption
  10. MediaRecorder之视频录制
  11. 德怀特·艾森豪威尔(1890-1969)美国第34任总统,陆军五星上将。
  12. flask自定义过滤器,flash,form表单
  13. 解决网易mumu启动失败问题
  14. Atomic类如何保证原子性
  15. Typora基本使用及快捷键
  16. 樱陀花园10月份活动策划
  17. 讨论主题:人工智能对人类社会发展的影响(弊大于利)
  18. 秒变黑科技的高效电脑软件,请低调收藏!
  19. adb push与adb pull
  20. 浪潮nf5280m5使用U盘安装win2012

热门文章

  1. java twaver_《TWaver Java开发手册》.pdf
  2. Linux网卡驱动(4)—DM9000网卡驱动程序完全分析
  3. Windows程序设计之WinAPI详解程序
  4. SAP FICO 第三节 BDC和LTMC导入S4财务科目
  5. ios visio流程图_Mac下有如Visio一样好用的流程图软件吗?
  6. RT-Thread硬件测试(一)—— 485串口测试
  7. 程序员面试必看32道经典逻辑推理题
  8. 【HTML】HTML浏览器打印自定义页眉页脚
  9. scratch 游戏html5,scratch3转换为html5
  10. 微信小程序开发之视频上传