http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1544&mosmsg=Submission+received+with+ID+13026638

题目大意:

有3个没有刻度的水壶,容量分别为a,b,c(均不超过200的正整数)。初始时候前两个水壶空,第三个装满了水。每次可以从一个水壶往另一个水壶倒水,直到其中一个水壶倒空或者另一个水壶倒满。为了使某个水壶恰好有d升水,至少要倒多少升的水?如果无解,则找一个小于且最接近于d的d'代替。

输出要求输出至少倒多少升水 和 d(d')

思路:

把能达到的状态看成图上的点,进行BFS。

然后我用的是优先队列,能保证最少倒的条件。(按当前倒的水量维护好了)

建模确实不太好建。

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cstring>
  4. using namespace std;
  5. const int MAXN=200+10;
  6. const int INF=2000000;
  7. bool vis[MAXN][MAXN][MAXN];
  8. int state[3],d,ans;
  9. struct node
  10. {
  11. int state[3];
  12. int val;
  13. node(){}
  14. node(int aa,int bb,int cc,int dd){ state[0]=aa;state[1]=bb;state[2]=cc;val=dd;}
  15. bool operator <(const node & x)const
  16. {
  17. return val>x.val;
  18. }
  19. };
  20. void bfs()
  21. {
  22. memset(vis,0,sizeof(vis));
  23. priority_queue<node> q;
  24. q.push(node(0,0,state[2],0));
  25. vis[0][0][state[2]]=true;
  26. while(!q.empty())
  27. {
  28. node cur=q.top();
  29. q.pop();
  30.  
  31. if(cur.state[0]==d || cur.state[1]==d || cur.state[2]==d)
  32. {
  33. ans=cur.val;
  34. return;
  35. }
  36.  
  37. for(int i=0;i<3;i++)
  38. {
  39. for(int j=0;j<3;j++) //j往i倒水
  40. {
  41. if(i==j) continue; //不能自己给自己倒水
  42. if(!cur.state[j]) continue; //为空不行
  43. node temp;
  44. int *t=temp.state; //用指针优化下可读性 就是说t和temp.state是一个数组
  45. if(cur.state[j] + cur.state[i] > state[i]) //超过了容量,只能倒满
  46. {
  47. t[i]=state[i];
  48. t[j]=cur.state[j] + cur.state[i] -state[i];
  49. t[3-i-j]=cur.state[3-i-j]; //3=0+1+2 所以减去代表剩下的那个
  50. temp.val=cur.val+state[i] - cur.state[i];
  51. }
  52. else
  53. {
  54. t[i]=cur.state[j] + cur.state[i];
  55. t[j]=0;
  56. t[3-i-j]=cur.state[3-i-j];
  57. temp.val=cur.val+cur.state[j];
  58. }
  59. if(!vis[ t[0] ][ t[1] ][ t[2] ]) //没访问过才加入队列
  60. {
  61. vis[ t[0] ][ t[1] ][ t[2] ]=true;
  62. q.push(temp);
  63. }
  64. }
  65. }
  66.  
  67. }
  68. }
  69. int main()
  70. {
  71. int T;
  72. scanf("%d",&T);
  73. while(T--)
  74. {
  75. ans=INF;
  76. scanf("%d%d%d%d",&state[0],&state[1],&state[2],&d);
  77. bfs();
  78. while(ans==INF)
  79. {
  80. d--;
  81. bfs();
  82. }
  83. printf("%d %d\n",ans,d);
  84. }
  85. return 0;
  86. }

UVA 10603 - Fill BFS~的更多相关文章

  1. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  2. UVa 10603 Fill [暴力枚举、路径搜索]

    10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...

  3. UVa 10603 Fill (暴力BFS+优先队列)

    题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...

  4. UVA - 10603 Fill(BFS求最小值问题)

    题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...

  5. UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ ...

  6. UVA 10603 Fill

    题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...

  7. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  8. 【路径寻找问题】UVa 10603 - Fill

    如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...

  9. 倒水问题(Fill, UVa 10603)

    [题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...

随机推荐

  1. 扩展: 简介pyinstaller: py文件压缩成exe文件

    写在开始: 后缀 .py 的文件, 必须在装有python解释器, 和相对应的模块下才能运行. 对于装13来说,比较不方便. 如果人家电脑上也装上了python解释器,  说不好一眼就看穿了 自己写的 ...

  2. python stomp activemq客户端

    #coding=utf-8import timeimport sysimport stomp class MyListener(object): def on_error(self, headers, ...

  3. 摆脱技术思维,转向产品思维——寻找“万能”IDC的苦恼

    背景:近期在新产品的开发任务完毕后一直在为寻找好的IDC和优质的托管服务忙碌.需求源自于我们重点要解决之前老版产品面临的国内外用户訪问速度慢甚至连接不上的问题. 除去架构技术上使用高性能.可扩展的方案 ...

  4. ubuntu网络重启后或主机重启后,/etc/resolv.conf恢复原样的解决办法

    ubuntu网络重启后或主机重启后,/etc/resolv.conf恢复原样的解决办法 /etc/resolv.conf中设置dns之后每次重启该文件会被覆盖,针对这种情况找了一些个解决方法 防止/e ...

  5. lubuntu自动登录(lxde)

    lubuntu自动登录(lxde) 1.重启ubuntu,在grub界面长按shirft进入grub菜单: 2.选择recovery mode,按"e"键进入编辑页面: 3.把ro ...

  6. Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

    if (isset($array[2])){ 抛出错误  Cannot use isset() on the result of an expression (you can use "nu ...

  7. eclipse - 下载网址

    这里面有着非常齐全的eclipse相关资源,而且都是放在网盘里面的,下载也方便 http://www.androiddevtools.cn/

  8. worktools-git 工具的使用总结(知识点累积)

    1.用简单列表的方式查看提交记录git log --pretty=online zhangshuli@zhangshuli-MS-:~/myGit$ git log --pretty=oneline ...

  9. holder.js如何使用

    holder.js的使用 一.总结 一句话总结:使用:holder.js后面接图片宽高 <img src="holder.js/300x200" /> 1.holder ...

  10. javascript创建对象的方法--工厂模式(非常好理解)

    javascript创建对象的方法--工厂模式(非常好理解) 一.简介 创建对象的方法 本质上都是把"属性"和"方法",封装成一个对象 创建对象的基本模式 普通 ...