http://acm.hdu.edu.cn/showproblem.php?pid=1495

题意:

有3个杯子a b c;a=b+c;然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相倒,假如说a倒入b中,只有当b满或a空时,才算倒一次;

a=4,b=1;c=3;

因为刚开始只有a中有;

先让a倒入c中3;step++;

c倒入b中1;step++;

b倒入a中1;step++;此时a和c中各有2;

代码如下:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<queue>
  5. #include<cmath>
  6. #define N 120
  7. using namespace std;
  8.  
  9. struct node
  10. {
  11. int a,b,c,step;
  12. friend bool operator<(node a,node b)
  13. {
  14. return a.step>b.step;
  15. }
  16. };
  17. int vis[N][N][N];
  18. int BFS(int a,int b,int c)
  19. {
  20. node q,p;
  21. priority_queue<node>Q;
  22. memset(vis,,sizeof(vis));
  23. p.a=a;p.b=;p.c=;p.step=;
  24. vis[p.a][p.b][p.c]=;
  25. Q.push(p);
  26. while(!Q.empty())
  27. {
  28. q=Q.top();
  29. Q.pop();
  30. if((q.a==a/&&q.b==a/)||(q.b==a/&&q.c==a/)||(q.a==a/&&q.c==a/) )
  31. return q.step;
  32. if(q.a!=)//a->其他;
  33. {
  34. if(q.a<=b-q.b)//a->b;如果a中的全都能倒到b中;
  35. {
  36. p.a=;
  37. p.b=a-q.c;
  38. p.c=q.c;
  39. p.step=q.step+;
  40. }
  41. else//a不能全到完;因为b满了;
  42. {
  43. p.a=a-b-q.c;
  44. p.b=b;
  45. p.c=q.c;
  46. p.step=q.step+;
  47. }
  48. if(vis[p.a][p.b][p.c]==)
  49. {
  50. vis[p.a][p.b][p.c]=;
  51. Q.push(p);
  52. }
  53.  
  54. //以下同理;
  55. if(q.a<=b-q.c)//a->c;如果a中的全都能倒到c中;
  56. {
  57. p.a=;
  58. p.b=q.b;
  59. p.c=a-q.b;
  60. p.step=q.step+;
  61. }
  62. else//a不能全到完;因为c满了;
  63. {
  64. p.a=a-c-q.b;
  65. p.b=q.b;
  66. p.c=c;
  67. p.step=q.step+;
  68. }
  69. if(vis[p.a][p.b][p.c]==)
  70. {
  71. vis[p.a][p.b][p.c]=;
  72. Q.push(p);
  73. }
  74. }
  75.  
  76. if(q.b!=)//b->其他;
  77. {
  78. if(q.b<=a-q.a)//b->a;如果b中的全都能倒到a中;
  79. {
  80. p.a=a-q.c;
  81. p.b=;
  82. p.c=q.c;
  83. p.step=q.step+;
  84. }
  85.  
  86. if(vis[p.a][p.b][p.c]==)
  87. {
  88. vis[p.a][p.b][p.c]=;
  89. Q.push(p);
  90. }
  91.  
  92. //以下同理;
  93. if(q.b<=c-q.c)//b->c;如果b中的全都能倒到c中;
  94. {
  95. p.a=q.a;
  96. p.b=;
  97. p.c=a-q.a;
  98. p.step=q.step+;
  99. }
  100. else//b不能全到完;因为c满了;
  101. {
  102. p.a=q.a;
  103. p.b=a-q.a-c;
  104. p.c=c;
  105. p.step=q.step+;
  106. }
  107. if(vis[p.a][p.b][p.c]==)
  108. {
  109. vis[p.a][p.b][p.c]=;
  110. Q.push(p);
  111. }
  112. }
  113.  
  114. if(q.c!=)//c->其他;
  115. {
  116. if(q.c<=a-q.a)//c->a;如果c中的全都能倒到a中;
  117. {
  118. p.a=a-q.b;
  119. p.b=q.b;
  120. p.c=;
  121. p.step=q.step+;
  122. }
  123.  
  124. if(vis[p.a][p.b][p.c]==)
  125. {
  126. vis[p.a][p.b][p.c]=;
  127. Q.push(p);
  128. }
  129.  
  130. //以下同理;
  131. if(q.c<=b-q.b)//c->b;如果c中的全都能倒到b中;
  132. {
  133. p.a=q.a;
  134. p.b=a-q.a;
  135. p.c=;
  136. p.step=q.step+;
  137. }
  138. else//c不能全到完;因为b满了;
  139. {
  140. p.a=q.a;
  141. p.b=b;
  142. p.c=a-q.a-b;
  143. p.step=q.step+;
  144. }
  145. if(vis[p.a][p.b][p.c]==)
  146. {
  147. vis[p.a][p.b][p.c]=;
  148. Q.push(p);
  149. }
  150. }
  151. }
  152. return -;
  153. }
  154.  
  155. int main()
  156. {
  157. int a,b,c,ans;
  158. while(scanf("%d%d%d",&a,&b,&c),a+b+c)
  159. {
  160. if(a%==)
  161. {
  162. printf("NO\n");
  163. continue;
  164. }
  165. else
  166. {
  167. ans=BFS(a,b,c);
  168. if(ans==-)
  169. printf("NO\n");
  170. else
  171. printf("%d\n",ans);
  172. }
  173. }
  174. return ;
  175. }

非常可乐---hdu 1495(BFS)的更多相关文章

  1. hdu 1495(BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  3. 非常可乐 HDU - 1495

    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...

  4. kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495

    题目链接:https://vjudge.net/problem/HDU-1495 题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两 ...

  5. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

  6. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

  7. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  8. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

随机推荐

  1. 【代码审计】EasySNS_V1.6 前台XSS跨站脚本漏洞分析

    0x00 环境准备 EasySNS官网:http://www.imzaker.com/ 网站源码版本:EasySNS极简社区V1.60 程序源码下载:http://es.imzaker.com/ind ...

  2. windows防火墙设置端口开放技巧

    选择“打开或者关闭windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口.(这里也可以在“入站规则”里选择已经存在的端口.) 指定ip开放3389端口 某新服务器,开放8 ...

  3. iOS开发-- 设置UIButton的文字显示位置、字体的大小、字体的颜色

    btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlS ...

  4. Nginx(五)-- 配置文件之Rewrite

    Rewrite支持URL重写 1.常用指令以及语法 1) if指令    if语法: if 空格 (condition) {}     条件:     1. “=” 来判断相等,用于字符的比较     ...

  5. C#中的垃圾回收机制与delegate

    在DeepStream的C#版本调试过程中,发现了一个问题,运行一段时间后,大概每次内存到16M(Debug模式)就会异常 错误“System.NullReferenceException:未将对象引 ...

  6. iOS - 扩展UIButton的响应区域

    扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...

  7. JS - url相关

    今天在找获取当前网址除去参数的js方式,结果自己会的竟然只有window.location.href 查到的一篇博文: http://www.cnblogs.com/weiyuxinghuacun/a ...

  8. 查询SQlServer相同表结构差异

    USE [数据库名] GO ); ); ); ); SET @DataName1='库1'; SET @DataName2='库2'; SET @TableName1='表1'; SET @Table ...

  9. XML读取(string形式进行读取)

    #region 测试XML二进制读取 string strXmlData = "<xml><ToUserName><![CDATA[gh_ef65912f88f ...

  10. ThinkPad L421 如何进入BIOS?(已解决)

    开机屏幕出现ThinkPad标志时,快速按下 F1键 即可进入BIOS