1. #include<iostream>
  2. #include<cstring>
  3. #define fillA 1
  4. #define pourAB 2
  5. #define dropA 3
  6. #define fillB 4
  7. #define pourBA 5
  8. #define dropB 6
  9.  
  10. #define N 10000
  11.  
  12. using namespace std;
  13. int vis[][];
  14. class node
  15. {
  16. public:
  17. int A, B;
  18. int dir;
  19. node()
  20. {
  21. A=;
  22. B=;
  23. }
  24. };
  25.  
  26. int a, b, c, tot;
  27. node q[N];
  28. int pre[N];
  29.  
  30. void printPath(int index)
  31. {
  32. if(index==)
  33. {
  34. cout<<tot<<endl;
  35. return ;
  36. }
  37. ++tot;
  38. printPath(pre[index]);
  39. switch(q[index].dir)
  40. {
  41. case :
  42. cout<<"FILL(1)";
  43. break;
  44. case :
  45. cout<<"POUR(1,2)";
  46. break;
  47. case :
  48. cout<<"DROP(1)";
  49. break;
  50. case :
  51. cout<<"FILL(2)";
  52. break;
  53. case :
  54. cout<<"POUR(2,1)";
  55. break;
  56. case :
  57. cout<<"DROP(2)";
  58. break;
  59. }
  60. cout<<endl;
  61. }
  62.  
  63. int bfs()
  64. {
  65. int head=, rear=, r;
  66. node cur, next;
  67. memset(vis, , sizeof(vis));
  68. pre[]=;
  69. vis[][]=;
  70. while(head<rear)
  71. {
  72. cur=q[head];
  73. if(cur.A==c || cur.B==c)
  74. {
  75. printPath(head);
  76. return ;
  77. }
  78. next=cur;
  79. if(!vis[a][cur.B])//将 A 装满
  80. {
  81. next.A=a;
  82. next.dir=fillA;
  83. pre[rear]=head;
  84. vis[a][cur.B]=;
  85. q[rear++]=next;
  86. }
  87. if(!vis[][cur.B])//将 A 倒掉
  88. {
  89. next.A=;
  90. next.dir=dropA;
  91. pre[rear]=head;
  92. vis[][cur.B]=;
  93. q[rear++]=next;
  94. }
  95. r=b-cur.B;
  96. next.dir=pourAB;
  97. if(r>cur.A && !vis[][cur.B+cur.A])//将A 倒向 B
  98. {
  99. next.A=;
  100. next.B=cur.B+cur.A;
  101. pre[rear]=head;
  102. q[rear++]=next;
  103. vis[][cur.B+cur.A]=;
  104. }
  105. else if(r<=cur.A && !vis[cur.A-r][cur.B+r])
  106. {
  107. next.A=cur.A-r;
  108. next.B=cur.B+r;
  109. pre[rear]=head;
  110. q[rear++]=next;
  111. vis[cur.A-r][cur.B+r]=;
  112. }
  113.  
  114. next=cur;//开始错在这里了, 忘记了从新给next赋值了
  115. if(!vis[cur.A][b])//将 B 装满
  116. {
  117. next.B=b;
  118. next.dir=fillB;
  119. pre[rear]=head;
  120. q[rear++]=next;
  121. vis[cur.A][b]=;
  122. }
  123. if(!vis[cur.A][])//将 B 倒掉
  124. {
  125. next.B=;
  126. next.dir=dropB;
  127. pre[rear]=head;
  128. q[rear++]=next;
  129. vis[cur.A][]=;
  130. }
  131. r=a-cur.A;
  132. next.dir=pourBA;
  133. if(r>cur.B && !vis[cur.B+cur.A][])//将B 倒向 A
  134. {
  135. next.B=;
  136. next.A=cur.B+cur.A;
  137. pre[rear]=head;
  138. q[rear++]=next;
  139. vis[cur.B+cur.A][]=;
  140. }
  141. else if(r<=cur.B && !vis[cur.A+r][cur.B-r])
  142. {
  143. next.A=cur.A+r;
  144. next.B=cur.B-r;
  145. pre[rear]=head;
  146. q[rear++]=next;
  147. vis[cur.A+r][cur.B-r]=;
  148. }
  149. ++head;
  150. }
  151. return ;
  152. }
  153.  
  154. int main()
  155. {
  156. while(cin>>a>>b>>c)
  157. {
  158. tot=;
  159. if(c>a && c>b)
  160. {
  161. cout<<"impossible"<<endl;
  162. continue;
  163. }
  164. if(!bfs())
  165. cout<<"impossible"<<endl;
  166. }
  167. return ;
  168. }

poj 3414 Pots bfs+模拟的更多相关文章

  1. POJ 3414 Pots bfs打印方案

    题目: http://poj.org/problem?id=3414 很好玩的一个题.关键是又16ms 1A了,没有debug的日子才是好日子.. #include <stdio.h> # ...

  2. POJ 3414 Pots(BFS)

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description You are g ...

  3. poj 3414 Pots(bfs+输出路径)

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

  4. POJ - 3414 Pots BFS(著名倒水问题升级版)

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

  5. POJ 3414 Pots (BFS/DFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7783   Accepted: 3261   Special Ju ...

  6. POJ 3414 Pots ( BFS , 打印路径 )

    题意: 给你两个空瓶子,只有三种操作 一.把一个瓶子灌满 二.把一个瓶子清空 三.把一个瓶子里面的水灌到另一个瓶子里面去(倒满之后要是还存在水那就依然在那个瓶子里面,或者被灌的瓶子有可能没满) 思路: ...

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

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

  8. BFS POJ 3414 Pots

    题目传送门 /* BFS:六种情况讨论一下,BFS轻松解决 起初我看有人用DFS,我写了一遍,TLE..还是用BFS,结果特判时出错,逗了好长时间 看别人的代码简直是受罪,还好自己终于发现自己代码的小 ...

  9. 广搜+输出路径 POJ 3414 Pots

    POJ 3414 Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13547   Accepted: 5718   ...

随机推荐

  1. weex逻辑控制

    在WEEX中,有if 和 repeat 两种逻辑运算,需要注意的是,逻辑控制不能够作用于<template>这样的根节点. if 控制判断条件true/false直接对节点进行操作,if= ...

  2. Python之路第一课Day9--随堂笔记之一(堡垒机实例以及数据库操作)未完待续....

    一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: ...

  3. webpack模块加载css文件及图片地址

    webpack支持css文件加载并打包,只需安装相应加载器并在配置文件中配置 . 加载的css文件内容会与该模块里的js内容混合封装,这样做的好处是一个js文件包含了所有的css与js内容,有效减少了 ...

  4. tab22

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. OUTLOOK 发生错误0x8004010D

    问题:    outlook 2003 在接收邮件时报错: “正在接收”报告了错误(0x8004010D):“在包含您的数据文件的驱动器上,磁盘空间不足.请清空“已删除邮件”文件夹或删除某些文件以释放 ...

  6. java学习之面向对象(2)

    在描述事物的时候,该事物已存在就具备的一些内容,这是我们就可以把它们都定义在构造函数中,那么什么是构造函数呢? 构造函数就是构建创造对象时调用的函数,它可以给对象进行初始化.构造函数与类名相同,第一个 ...

  7. 执行jar文件生成pdf报错,Unsupported URL <file:///home

    java -Djava.library.path=/usr/local/lib/ruby/gems/1.8/gems/sharp_office-1.0.1/ext/sigar -jar /usr/lo ...

  8. Expert 诊断优化系列------------------给TempDB 降温

    前面文章针对CPU.内存.磁盘.语句.等待讲述了SQL SERVER的一些基本的问题诊断与调优方式.为了方便阅读给出导读文章链接方便阅读: SQL SERVER全面优化-------Expert fo ...

  9. 一小时包教会 —— webpack 入门指南

    什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...

  10. ASP.Net请求处理机制初步探索之旅 - Part 3 管道

    开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest().HttpRuntime.ProcessReq ...