题目链接

http://poj.org/problem?id=3414

题意

给出两个杯子 容量分别为 A B 然后给出C 是目标容量

有三种操作

1 将一个杯子装满

2.将一个杯子全都倒掉

3.将一个杯子的水倒到另一个杯子里面

如果某个杯子里面的水 能够达到 目标容量 那么就输出步骤

思路

BFS 并且要存储步骤

每一步一共有六步操作 记得标记

AC代码

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <ctype.h>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <climits>
  7. #include <ctime>
  8. #include <iostream>
  9. #include <algorithm>
  10. #include <deque>
  11. #include <vector>
  12. #include <queue>
  13. #include <string>
  14. #include <map>
  15. #include <stack>
  16. #include <set>
  17. #include <numeric>
  18. #include <sstream>
  19. #include <iomanip>
  20. #include <limits>
  21. #define CLR(a) memset(a, 0, sizeof(a))
  22. #define pb push_back
  23. using namespace std;
  24. typedef long long ll;
  25. typedef long double ld;
  26. typedef unsigned long long ull;
  27. typedef pair <int, int> pii;
  28. typedef pair <ll, ll> pll;
  29. typedef pair<string, int> psi;
  30. typedef pair<string, string> pss;
  31. const double PI = acos(-1.0);
  32. const double E = exp(1.0);
  33. const double eps = 1e-8;
  34. const int INF = 0x3f3f3f3f;
  35. const int maxn = 1e2 + 5;
  36. const int MOD = 1e9 + 7;
  37. /*
  38. 0 FILL 1
  39. 1 FILL 2
  40. 2 DROP 1
  41. 3 DROP 2
  42. 4 POUR 1 2
  43. 5 POUR 2 1
  44. */
  45. int visit[maxn][maxn];
  46. vector <int> ans;
  47. int flag;
  48. int a, b, c;
  49. struct node
  50. {
  51. int a, b;
  52. vector <int> v;
  53. };
  54. void bfs()
  55. {
  56. queue <node> q;
  57. node tmp;
  58. tmp.a = 0;
  59. tmp.b = 0;
  60. tmp.v.clear();
  61. q.push(tmp);
  62. visit[0][0] = 1;
  63. while (!q.empty())
  64. {
  65. node u = q.front(), v;
  66. q.pop();
  67. if (u.a == c || u.b == c)
  68. {
  69. flag = 1;
  70. ans = u.v;
  71. return;
  72. }
  73. if (u.a < a)
  74. {
  75. v.a = a;
  76. v.b = u.b;
  77. if (visit[v.a][v.b] == 0)
  78. {
  79. v.v = u.v;
  80. v.v.pb(0);
  81. q.push(v);
  82. visit[v.a][v.b] = 1;
  83. }
  84. }
  85. if (u.b < b)
  86. {
  87. v.a = u.a;
  88. v.b = b;
  89. if (visit[v.a][v.b] == 0)
  90. {
  91. v.v = u.v;
  92. v.v.pb(1);
  93. q.push(v);
  94. visit[v.a][v.b] = 1;
  95. }
  96. }
  97. if (u.a > 0)
  98. {
  99. v.a = 0;
  100. v.b = u.b;
  101. if (visit[v.a][v.b] == 0)
  102. {
  103. v.v = u.v;
  104. v.v.pb(2);
  105. q.push(v);
  106. visit[v.a][v.b] = 1;
  107. }
  108. }
  109. if (u.b > 0)
  110. {
  111. v.a = u.a;
  112. v.b = 0;
  113. if (visit[v.a][v.b] == 0)
  114. {
  115. v.v = u.v;
  116. v.v.pb(3);
  117. q.push(v);
  118. visit[v.a][v.b] = 1;
  119. }
  120. }
  121. if (u.a < a)
  122. {
  123. int c = a - u.a;
  124. if (u.b >= c)
  125. {
  126. v.b = u.b - c;
  127. v.a = a;
  128. }
  129. else
  130. {
  131. v.b = 0;
  132. v.a = u.a + u.b;
  133. }
  134. if (visit[v.a][v.b] == 0)
  135. {
  136. v.v = u.v;
  137. v.v.pb(5);
  138. q.push(v);
  139. visit[v.a][v.b] = 1;
  140. }
  141. }
  142. if (u.b < b)
  143. {
  144. int c = b - u.b;
  145. if (u.a >= c)
  146. {
  147. v.a = u.a - c;
  148. v.b = b;
  149. }
  150. else
  151. {
  152. v.a = 0;
  153. v.b = u.a + u.b;
  154. }
  155. if (visit[v.a][v.b] == 0)
  156. {
  157. v.v = u.v;
  158. v.v.pb(4);
  159. q.push(v);
  160. visit[v.a][v.b] = 1;
  161. }
  162. }
  163. }
  164. }
  165. int main()
  166. {
  167. map <int, string> M;
  168. M[0] = "FILL(1)";
  169. M[1] = "FILL(2)";
  170. M[2] = "DROP(1)";
  171. M[3] = "DROP(2)";
  172. M[4] = "POUR(1,2)";
  173. M[5] = "POUR(2,1)";
  174. CLR(visit, 0);
  175. scanf("%d%d%d", &a, &b, &c);
  176. flag = 0;
  177. bfs();
  178. if (flag == 0)
  179. printf("impossible\n");
  180. else
  181. {
  182. int len = ans.size();
  183. cout << len << endl;
  184. for (int i = 0; i < len; i++)
  185. cout << M[ans[i]] << endl;
  186. }
  187. }

POJ - 3414 Pots 【BFS】的更多相关文章

  1. poj 3414 Pots 【BFS+记录路径 】

    //yy:昨天看着这题突然有点懵,不知道怎么记录路径,然后交给房教了,,,然后默默去写另一个bfs,想清楚思路后花了半小时写了120+行的代码然后出现奇葩的CE,看完FAQ改了之后又WA了.然后第一次 ...

  2. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  3. poj 3414 Pots【bfs+回溯路径 正向输出】

    题目地址:http://poj.org/problem?id=3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  4. poj 3414 Pots ( bfs )

    题目:http://poj.org/problem?id=3414 题意:给出了两个瓶子的容量A,B, 以及一个目标水量C, 对A.B可以有如下操作: FILL(i)        fill the ...

  5. POJ 3414 Pots 暴力,bfs 难度:1

    http://poj.org/problem?id=3414 记录瓶子状态,广度优先搜索即可 #include <cstdio> #include <cstring> #inc ...

  6. poj 3414 Pots (bfs+线索)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10071   Accepted: 4237   Special J ...

  7. (简单) POJ 3414 Pots,BFS+记录路径。

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  8. POJ 3414 Pots(BFS+回溯)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11705   Accepted: 4956   Special J ...

  9. 【BFS】POJ 3414

    直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...

随机推荐

  1. 【Excle数据透视表】如何得到数据透视表中某个汇总行的明细数据

    例如: 现在想得到"北京 汇总"的明细数据,该怎么处理呢? 步骤 右键数据透视表任意单元格→数据透视表选项→启用显示明细数据→确定→单击"北京 汇总"行最后一个 ...

  2. mongo 增

    mongodb存储的是文档,文档是json格式的对象,我们的增删改查,都要传输json对象 json是一个对象,js里有数组这个概念,只需要把多个对象放到一个数组里,即可 use test //首先选 ...

  3. Loadrunner 关于参数赋值取值的操作

    1.参数的赋值和取值 lr_save_string("hello world","param"); lr_eval_string("{param}&q ...

  4. Android模拟屏幕点击input tap替代解决方案

    动机解释 本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap 但是手上的这台目标Android机4.0.3系统的input只支持 ...

  5. unity3d WebPlayer版本号音效无声音问题

    unity web player,其是一款浏览器执行unity3d游戏引擎公布的游戏的插件,和Flash Player非常像,安全无毒应该是你玩某款网页游戏安装的.假设以后不玩了就能够卸载 Unity ...

  6. atitit.基于bat cli的插件管理系统.doc

    atitit.基于bat cli的插件管理系统.doc /AtiPlatf/src_atibrow/com/attilax/cmd/CmdX.java pathx.isWebPathMode=true ...

  7. Eclipse Plugin Installation and Windows User Access Control

    I make Eclipse Plugins and I sell them to developers using Eclipse. Most of the visitors to my web s ...

  8. Sphinx之配置文件

    # # Sphinx configuration file sample # # WARNING! While this sample file mentions all available opti ...

  9. iOS iPhoneX/iPhoneXS/iPhoneXR/iPhoneXS Max系列适配

    以前异性屏只有一款iPhoneX,所以在适配的时候直接判断高度是否等于812即可判断是否是iPhoneX #define IS_IPHONE_X (IS_IPHONE && SCREE ...

  10. PL/0编译程序

    Pl/0语言文法的BNF表示: 〈程序〉→〈分程序>. 〈分程序〉→ [<常量说明部分>][<变量说明部分>][<过程说明部分>]〈语句〉 <常量说明部 ...