HDU 1495 喝可乐(暴力BFS)

浅浅的花香味﹌ 2021-09-30 04:26 360阅读 0赞

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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:

  1. 7 4 3
  2. 4 1 3
  3. 0 0 0

Sample Output:

  1. NO
  2. 3

这个题吧,就是把六种情况进行模拟知道得到结果,当然也可能没有结果。

六种情况:

从S倒cola到N,从S倒colaM,从N倒cola到M,从M倒cola到N,从N倒cola到S,从M倒cola到S。

关键是用一个二维或三维(推荐二维)数组去记录状态,否则很容易超内存。

废话不多说,上代码:

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<queue>
  4. #include<vector>
  5. #include<cstring>
  6. using namespace std;
  7. int S,N,M;
  8. struct D
  9. {
  10. int TM,TS,TN,t;
  11. };
  12. bool book[105][105]; //标记状态
  13. int BFS()
  14. {
  15. queue<D>Q;
  16. D first;
  17. first.TS = S,first.TN = 0,first.TM = 0,first.t = 0;
  18. Q.push(first);
  19. while(!Q.empty())
  20. {
  21. D mid = Q.front();
  22. if(mid.TS == mid.TN && mid.TM == 0)
  23. {
  24. return mid.t;
  25. }
  26. Q.pop();
  27. if(mid.TN<N) //S->N
  28. {
  29. D midd = mid;
  30. if(mid.TS>N-mid.TN)
  31. {
  32. midd.TS -= N-midd.TN;
  33. midd.TN = N;
  34. midd.t++;
  35. if(book[midd.TN][midd.TM] == false)//判断,如果没出现过再往下
  36. {
  37. Q.push(midd);
  38. book[midd.TN][midd.TM] = true;
  39. }
  40. }
  41. }
  42. if(mid.TM<M) //S->M
  43. {
  44. D midd = mid;
  45. if(mid.TS>M-mid.TM)
  46. {
  47. midd.TS -= M-midd.TM;
  48. midd.TM = M;
  49. midd.t++;
  50. if(book[midd.TN][midd.TM] == false)
  51. {
  52. Q.push(midd);
  53. book[midd.TN][midd.TM] = true;
  54. }
  55. }
  56. }
  57. if(mid.TN) //N->S
  58. {
  59. D midd = mid;
  60. midd.TS += midd.TN;
  61. midd.TN = 0;
  62. midd.t++;
  63. if(book[midd.TN][midd.TM] == false)
  64. {
  65. Q.push(midd);
  66. book[midd.TN][midd.TM] = true;
  67. }
  68. }
  69. if(mid.TM) //M->S
  70. {
  71. D midd = mid;
  72. midd.TS += midd.TM;
  73. midd.TM = 0;
  74. midd.t++;
  75. if(book[midd.TN][midd.TM] == false)
  76. {
  77. Q.push(midd);
  78. book[midd.TN][midd.TM] = true;
  79. }
  80. }
  81. if(mid.TM<M && mid.TN) //N->M
  82. {
  83. D midd = mid;
  84. if(midd.TN>=M-midd.TM)
  85. {
  86. midd.TN -= M-midd.TM;
  87. midd.TM = M;
  88. }
  89. else
  90. {
  91. midd.TM += midd.TN;
  92. midd.TN = 0;
  93. }
  94. midd.t++;
  95. if(book[midd.TN][midd.TM] == false)
  96. {
  97. Q.push(midd);
  98. book[midd.TN][midd.TM] = true;
  99. }
  100. }
  101. if(mid.TN<N && mid.TM) //M->N
  102. {
  103. D midd = mid;
  104. if(midd.TM>=N-midd.TN)
  105. {
  106. midd.TM -= N-midd.TN;
  107. midd.TN = N;
  108. }
  109. else
  110. {
  111. midd.TN += midd.TM;
  112. midd.TM = 0;
  113. }
  114. midd.t++;
  115. if(book[midd.TN][midd.TM] == false)Q.push(midd);
  116. book[midd.TN][midd.TM] = true;
  117. }
  118. }
  119. return -1;//没有返回-1
  120. }
  121. int main()
  122. {
  123. while(scanf("%d %d %d",&S,&N,&M) && S|N|M)
  124. {
  125. if(S&1)//S是奇数就过。
  126. {
  127. printf("NO\n");
  128. continue;
  129. }
  130. memset(book,false,sizeof(book));
  131. book[0][0] = true;
  132. if(M>N)
  133. {
  134. int mid = N;
  135. N = M;
  136. M = mid;
  137. }
  138. int T = BFS();
  139. if(T == -1)printf("NO\n");
  140. else printf("%d\n",T);
  141. }
  142. return 0;
  143. }

转载于:https://www.cnblogs.com/vocaloid01/p/9514312.html

发表评论

表情:
评论列表 (有 0 条评论,360人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 1728(BFS)

    问题描述: 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些