题目描写叙述 Description

有两个无刻度标志的水壶。分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。

设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也能够相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问怎样通过倒水或灌水操作。 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来。

输入描写叙述 Input Description

一行,三个数据。分别表示 x,y 和 z;

输出描写叙述 Output Description

一行,输出最小步数 ,假设无法达到目标,则输出"impossible"

例子输入 Sample Input

3 22 1

例子输出 Sample Output

14

数据范围及提示 Data Size & Hint

此题数据太弱了,DFS略微剪枝下都能过,无语
倒水一共同拥有6种策略:
操作1:装满a桶

操作2:装满b桶

操作3:清空a桶

操作4:清空b桶

操作5:将B桶中的水倒入A桶

操作6:将A桶的水倒入B桶
每种策略在推断条件后模拟一遍就OK了。只是要注意判重
无论是DFS还是BFS。强调它的判重仅仅须要数组就够了,不是必需像ZFX童鞋那样用STL的set。因为x,y<=100。最多有10000种状态。数组不会爆
1、DFS
这里判重数组不仅要保存该结点是否訪问过。并且要记录该结点的步数(即解的好坏),便于为后面循环求得最优解
  1. #include <stdio.h>
  2. #define MAXN 200
  3. #define INF 10000000
  4. int f[MAXN][MAXN],a,b,z; //f[x][y]=达到A桶内水量为x,B桶内水量为y的状态所需步骤数
  5. void dfs(int x,int y,int step) //x=A桶内水量,y=B桶内水量,step=当前步骤数
  6. {
  7. if(f[x][y]!=0&&step+1>=f[x][y]) return; //当前状态已经有解且如今的解一定比过去的解更差时,退出
  8. f[x][y]=step+1; //更新当前状态所需最少步骤数
  9. dfs(x,0,step+1); //1、清空B桶
  10. dfs(0,y,step+1); //2、清空A桶
  11. dfs(x,b,step+1); //3、装满B桶
  12. dfs(a,y,step+1); //4、装满A桶
  13. //5、将B桶倒入A桶
  14. if(x+y<=a)
  15. dfs(x+y,0,step+1);//(i)B桶倒空后A桶不会溢出
  16. else
  17. dfs(a,x+y-a,step+1); //(ii)B桶倒空后A桶会溢出,故B桶中有残留
  18. //6、将A桶倒入B桶
  19. if(x+y<=b)
  20. dfs(0,x+y,step+1);//(i)A桶倒空后B桶不会溢出
  21. else
  22. dfs(x+y-b,b,step+1); //(ii)A桶倒空后B桶会溢出,故A桶中有残留
  23. }
  24. int main()
  25. {
  26. int i,j,ans=INF;
  27. scanf("%d%d%d",&a,&b,&z);
  28. dfs(0,0,0);
  29. for(i=0;i<=a;i++)
  30. if(f[i][z]!=0)
  31. if(f[i][z]<ans)
  32. ans=f[i][z]; //遍历全部B桶中达到水量z的情况。获得最优解
  33. for(i=0;i<=b;i++)
  34. if(f[z][i]!=0)
  35. if(f[z][i]<ans)
  36. ans=f[z][i]; //遍历全部B桶中达到水量z的情况,获得最优解
  37. if(ans==INF) printf("impossible\n");
  38. else printf("%d\n",ans-1);
  39. return 0;
  40. }

2、BFS
BFS做法略微复杂些。只是和DFS殊途同归,依据BFS的性质。BFS终于搜索出的结果就是最优解,判重数组仅仅需保存每一个结点是否訪问过就能够了,另外BFS的判重很重要。否则BFS将进入死循环(我刚開始的代码就是这样,调了一个多小时。ORZ)
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <queue>
  4. #define MAXN 110
  5. using namespace std;
  6. int a,b,z,f[MAXN][MAXN]; //目标是取z L水
  7. struct cup
  8. {
  9. int x; //x桶(大桶)中的水量
  10. int y; //y桶(小桶)中的水量
  11. int sol; //sol=量出的水量
  12. int step; //step=倒水次数
  13. }first,now;
  14. queue<cup>Q;
  15. void extend(cup in) //扩展结点
  16. {
  17. if(f[in.x][in.y]!=0) return;
  18. f[in.x][in.y]++;
  19. in.step++;
  20. cup p=in;
  21. //操作1:装满a桶
  22. p.x=a;
  23. Q.push(p);
  24. //操作2:装满b桶
  25. p=in;
  26. p.y=b;
  27. Q.push(p);
  28. //操作3:清空a桶
  29. p=in;
  30. p.x=0;
  31. Q.push(p);
  32. //操作4:清空b桶
  33. p=in;
  34. p.y=0;
  35. Q.push(p);
  36. //操作5:将B桶中的水倒入A桶
  37. p=in;
  38. if(in.x+in.y<=a) //(i)B桶倒空后A桶不会溢出
  39. {
  40. p.x=in.x+in.y;
  41. p.y=0;
  42. Q.push(p);
  43. }
  44. else //(ii)B桶倒空后A桶会溢出,故B桶中有残留
  45. {
  46. p.x=a;
  47. p.y=in.x+in.y-a;
  48. Q.push(p);
  49. }
  50. //操作6:将A桶的水倒入B桶
  51. p=in;
  52. if(in.x+in.y<=b) //(i)A桶倒空后B桶不会溢出
  53. {
  54. p.y=in.x+in.y;
  55. p.x=0;
  56. Q.push(p);
  57. }
  58. else //(ii)A桶倒空后B桶会溢出,故A桶中有残留
  59. {
  60. p.y=b;
  61. p.x=in.x+in.y-b;
  62. Q.push(p);
  63. }
  64. }
  65. void bfs()
  66. {
  67. Q.push(first);
  68. while(!Q.empty())
  69. {
  70. now=Q.front();
  71. Q.pop(); //取出队首状态
  72. if(now.x==z||now.y==z)
  73. {
  74. printf("%d\n",now.step);
  75. exit(0);
  76. }
  77. extend(now);
  78. }
  79. printf("impossible\n");
  80. }
  81. int main()
  82. {
  83. scanf("%d%d%d",&a,&b,&z);
  84. first.step=0;
  85. first.x=0;
  86. first.y=0;
  87. bfs();
  88. return 0;
  89. }

 

[Wikioi 1226]倒水问题的更多相关文章

  1. 广度优先搜索 cdoevs 1226 倒水问题

    cdoevs 1226 倒水问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升 ...

  2. codevs 1226 倒水问题

    1226 倒水问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x, ...

  3. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  4. 洛谷P1432 倒水问题(CODEVS.1226)

    To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...

  5. 倒水问题 (codevs 1226) 题解

    [问题描述] 有两个无刻度标志的水壶,分别可装x升和y升 ( x,y 为整数且均不大于100)的水.设另有一水缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒.已知x升壶为空壶, ...

  6. BZOJ 1226: [SDOI2009]学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 730  Solved: 446[Submit][ ...

  7. POJ 1226 后缀数组

    题目链接:http://poj.org/problem?id=1226 题意:给定n个字符串[只含大小写字母],求一个字符串要求在n个串或者他们翻转后的串的出现过.输出满足要求的字符串的长度 思路:根 ...

  8. 【wikioi】1041 Car的旅行路线

    题目链接 算法:最短路(数据弱,Floyd也能过) 惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =.(对不起,wikio ...

  9. 【wikioi】1040 统计单词个数

    题目链接 算法:划分型DP PS:被卡过3天.日期:2013-10-10 ~ 2013-10-12 18:52:48 这题是我提交了13次AC= =汗= = 题目描述: 给出一个长度不超过200的由小 ...

随机推荐

  1. Django day05 视图层之 (HttpRequest) \ (HttpResponse) \ (JsonResponse) 对象

    一:视图层之HttpRequest对象 # 前台Post传过来的数据,包装到POST字典中 # request.POST # 前台浏览器窗口里携带的数据,包装到GET字典中 # request.GET ...

  2. [转]利用 NPOI 變更字體尺寸及樣式

    本文转自:http://blog.cscworm.net/?p=1650 利用 NPOI 變更字體尺寸及樣式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. JavaScript 元素的插入顺序以及动态加载js

    *****************记录下今天的心得***************** 1.元素的插入顺序 需求:异步从后台读取两个数据a和b,并动态加载到父容器x中,要求a必须在b的左边 实际情况:一 ...

  4. CSS制作简单loading动画

    曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出来.比如一个旋转的圆圈,并不都是将gif图放进去,有些就是画个静止图像,然后让它旋转就 ...

  5. Beta冲刺-星期四

    这个作业属于哪个课程  <课程的链接>            这个作业要求在哪里 <作业要求的链接> 团队名称 Three cobblers 这个作业的目标 完成今天的冲刺 一 ...

  6. VMware中linux安装jdk

    首先安装linux系统 如何将jdk安装包复制到linux中不做概述,可以使用xftp工具,或者Xshell,或者其他方式. 1.下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如j ...

  7. Eigen与Matlab语法及语义辞典

    Eigen为Matlab转换为C++提供了一个简单的语法级别的代码迁移工具. 对一些代码进行了扩充,以便程序由Matlab到Eigen的移植................... 参考链接:http: ...

  8. VC维与DNN的Boundary

    原文链接:解读机器学习基础概念:VC维来去 作者:vincentyao 目录: 说说历史 Hoeffding不等式 Connection to Learning 学习可行的两个核心条件 Effecti ...

  9. 读书笔记「Python编程:从入门到实践」_5.if语句

    5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': print(car.up ...

  10. mqtt-client回调方法简介

    mqtt-client回调方法简介 毫无疑问Callback方式是最复杂的一种,但是其也是能够提供更好的服务,因此有必要好好研究,下面就是对使用回调方式的简单介绍: 一.在使用回调方式前,先通过MQT ...