非常可乐

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10442    Accepted Submission(s): 4193

Problem Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
 
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
 
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
 
Sample Input
7 4 3
4 1 3
0 0 0
 
Sample Output
NO
3
 
思路:水杯A向水杯B到水的经典公式。 mn=min(B-now.b,now.a),na=now.a-mn,nb=now.b+mn.
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. const int MAXN=;
  7. struct Node{
  8. int s,n,m;
  9. int step;
  10. Node(){}
  11. Node(int cs,int cn,int cm,int cstep)
  12. {
  13. s=cs;
  14. n=cn;
  15. m=cm;
  16. step=cstep;
  17. }
  18. };
  19. int vis[MAXN][MAXN][MAXN];
  20. int S,N,M;
  21. void bfs()
  22. {
  23. queue<Node> que;
  24. que.push(Node(S,,,));
  25. vis[S][N][M]=;
  26. while(!que.empty())
  27. {
  28. Node now=que.front();que.pop();
  29. if((now.s==&&now.n==now.m)||(now.n==&&now.s==now.m)||(now.m==&&now.s==now.n))
  30. {
  31. printf("%d\n",now.step);
  32. return ;
  33. }
  34. int nes,nen,nem,mn;
  35. mn=min(N-now.n,now.s);
  36. nes=now.s-mn;
  37. nen=now.n+mn;
  38. nem=now.m;
  39. if(!vis[nes][nen][nem])
  40. {
  41. vis[nes][nen][nem]=;
  42. que.push(Node(nes,nen,nem,now.step+));
  43. }
  44.  
  45. mn=min(M-now.m,now.s);
  46. nes=now.s-mn;
  47. nen=now.n;
  48. nem=now.m+mn;
  49. if(!vis[nes][nen][nem])
  50. {
  51. vis[nes][nen][nem]=;
  52. que.push(Node(nes,nen,nem,now.step+));
  53. }
  54.  
  55. mn=min(S-now.s,now.n);
  56. nes=now.s+mn;
  57. nen=now.n-mn;
  58. nem=now.m;
  59. if(!vis[nes][nen][nem])
  60. {
  61. vis[nes][nen][nem]=;
  62. que.push(Node(nes,nen,nem,now.step+));
  63. }
  64.  
  65. mn=min(M-now.m,now.n);
  66. nes=now.s;
  67. nen=now.n-mn;
  68. nem=now.m+mn;
  69. if(!vis[nes][nen][nem])
  70. {
  71. vis[nes][nen][nem]=;
  72. que.push(Node(nes,nen,nem,now.step+));
  73. }
  74.  
  75. mn=min(S-now.s,now.m);
  76. nes=now.s+mn;
  77. nen=now.n;
  78. nem=now.m-mn;
  79. if(!vis[nes][nen][nem])
  80. {
  81. vis[nes][nen][nem]=;
  82. que.push(Node(nes,nen,nem,now.step+));
  83. }
  84.  
  85. mn=min(N-now.n,now.m);
  86. nes=now.s;
  87. nen=now.n+mn;
  88. nem=now.m-mn;
  89. if(!vis[nes][nen][nem])
  90. {
  91. vis[nes][nen][nem]=;
  92. que.push(Node(nes,nen,nem,now.step+));
  93. }
  94. }
  95. printf("NO\n");
  96. }
  97. int main()
  98. {
  99. while(scanf("%d%d%d",&S,&N,&M)!=EOF&&S&&N&&M)
  100. {
  101. memset(vis,,sizeof(vis));
  102. if(S%!=)
  103. {
  104. printf("NO\n");
  105. }
  106. else bfs();
  107. }
  108. return ;
  109. }
 

HDOJ1495(倒水BFS)的更多相关文章

  1. hdu1495 倒水bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1495/ 题意:给定三个杯子S,M,N,满足S=M+N,现在要求用最短的次数将S杯中的饮倒平分到两个杯子中.我们首 ...

  2. poj3414Pots(倒水BFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13231   Accepted: 5553   Special J ...

  3. hdoj1495简单BFS

    #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...

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

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

  5. codevs1226倒水问题(Bfs)

    /* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...

  7. HDU 1495 非常可乐【BFS/倒水问题】

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

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

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

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

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

随机推荐

  1. Frobenius inner product

    https://en.wikipedia.org/wiki/Frobenius_inner_product Frobenius norm

  2. zabbix_get 命令介绍

    zabbix_get 是 zabbix 服务端的一个命令,用于检测 agent 端的配置是否正确,可以很方便地知道 key 是否能正常获取到数据,在测试自定义监控的时候特别有用 [root@crazy ...

  3. spring mvc 基本原理

    在web.xml配置spring mvc入口servlet: <servlet> <servlet-name>mvc-dispatcher</servlet-name&g ...

  4. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

  5. MyEclipse2014新增bug,尝鲜的朋友需注意NotFoundException: org.springframework.web.context.ContextLoaderListener

    事实上标题后面加上这个异常信息并不合适,可是为了方便和我遇到相同问题的童鞋搜到这篇文章.我不得不这样写啦. 这个异常和你的程序没有关系,假设你没有忘记增加spring Jar包的话,这是fucking ...

  6. Python基础(4)_字典、集合、bool值

    三.字典 定义:{key1:value1,key2:value2},key-value结构,key必须是不可变类型,或者可hash 基本形式:key:value特性: 1.可存放多个值 2.可修改指定 ...

  7. LeetCode:零钱兑换【322】【DP】

    LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...

  8. LeetCode:删除排序链表中的重复元素【83】

    LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...

  9. Android selector背景选择器

    selector根据不同的选定状态来定义不同的现实效果 常用属性: android:state_selected--------选中 android:state_focused--------获得焦点 ...

  10. 剑指offer——二叉树的深度与平衡二叉树的判断

    通过后续遍历,可以减少重复访问 #include <iostream> #include <string> using namespace std; struct Binary ...