HDU - 1495 非常可乐(bfs)

原创 2018年04月16日 16:48:17

非常可乐

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


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
 
Author
seeyou
 
Source
Recommend
LL
Statistic | Submit | Discuss | Note

思路:a可以往b中倒水,可以往c倒。。。。总共有六种情况,BFS广度搜索就行了

注意搜索的时候要标记一下状态,用visit,不然会queue会超限。

就是代码有点多,要仔细。。。

 网上大佬用数学方法做的orz。。。。https://blog.csdn.net/v5zsq/article/details/52097459,看不懂啊。

复制代码
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <queue>
  4 #include <cstring>
  5 
  6 using namespace std;
  7 
  8 typedef struct info{
  9     int a,b,c;
 10     int countt;
 11 }cup;
 12 
 13 int s,m,n;
 14 cup c1;
 15 cup now,nextt;
 16 int visit[105][105][105];
 17 
 18 
 19 int bfs(cup c){
 20 //    while(!q.empty()){
 21 //        q.pop();
 22 //    }
 23     queue<cup> q;
 24     q.push(c);
 25     while(!q.empty()){
 26         now=q.front(); q.pop();
 27 
 28         if((now.a==s/2&&now.b==s/2)||(now.a==s/2&&now.c==s/2)||(now.b==s/2&&now.c==s/2)){
 29             return now.countt;
 30         }
 31         if(now.a!=0){//第一个杯子向其他两个倒水
 32             int vol=n-now.b;
 33             if(vol!=0){
 34                 if(now.a>=vol){
 35                     nextt.b=n;
 36                     nextt.a=now.a-vol;
 37                     nextt.c=now.c;
 38                     nextt.countt=now.countt+1;
 39                 }else{
 40                     nextt.b=now.b+now.a;
 41                     nextt.a=0;
 42                     nextt.c=now.c;
 43                     nextt.countt=now.countt+1;
 44                 }
 45                 if(!visit[nextt.a][nextt.b][nextt.c]){
 46                     visit[nextt.a][nextt.b][nextt.c]=1;
 47                     q.push(nextt);
 48                 }
 49             }
 50 
 51             vol=m-now.c;
 52             if(vol!=0){
 53                 if(now.a>=vol){
 54                     nextt.c=m;
 55                     nextt.a=now.a-vol;
 56                     nextt.b=now.b;
 57                     nextt.countt=now.countt+1;
 58                     q.push(nextt);
 59                 }else{
 60                     nextt.c=now.c+now.a;
 61                     nextt.a=0;
 62                     nextt.b=now.b;
 63                     nextt.countt=now.countt+1;
 64                 }
 65                 if(!visit[nextt.a][nextt.b][nextt.c]){
 66                     visit[nextt.a][nextt.b][nextt.c]=1;
 67                     q.push(nextt);
 68                 }
 69             }
 70         }
 71 
 72         if(now.b!=0){//第二个杯子忘其他两个倒水
 73             int vol=s-now.a;
 74             if(vol!=0){
 75                 if(now.b>=vol){
 76                     nextt.a=s;
 77                     nextt.b=now.b-vol;
 78                     nextt.c=now.c;
 79                     nextt.countt=now.countt+1;
 80                 }else{
 81                     nextt.a=now.a+now.b;
 82                     nextt.b=0;
 83                     nextt.c=now.c;
 84                     nextt.countt=now.countt+1;
 85                 }
 86                 if(!visit[nextt.a][nextt.b][nextt.c]){
 87                     visit[nextt.a][nextt.b][nextt.c]=1;
 88                     q.push(nextt);
 89                 }
 90             }
 91 
 92             vol=m-now.c;
 93             if(vol!=0){
 94                 if(now.b>=vol){
 95                     nextt.c=m;
 96                     nextt.a=now.a;
 97                     nextt.b=now.b-vol;
 98                     nextt.countt=now.countt+1;
 99                 }else{
100                     nextt.c=now.c+now.b;
101                     nextt.b=0;
102                     nextt.a=now.a;
103                     nextt.countt=now.countt+1;
104                 }
105                 if(!visit[nextt.a][nextt.b][nextt.c]){
106                     visit[nextt.a][nextt.b][nextt.c]=1;
107                     q.push(nextt);
108                 }
109             }
110         }
111 
112         if(now.c!=0){//第三个杯子忘其他两个倒水
113             int vol=s-now.a;
114             if(vol!=0){
115                 if(now.c>=vol){
116                     nextt.a=s;
117                     nextt.c=now.c-vol;
118                     nextt.b=now.b;
119                     nextt.countt=now.countt+1;
120                 }else{
121                     nextt.a=now.a+now.c;
122                     nextt.c=0;
123                     nextt.b=now.b;
124                     nextt.countt=now.countt+1;
125                 }
126                 if(!visit[nextt.a][nextt.b][nextt.c]){
127                     visit[nextt.a][nextt.b][nextt.c]=1;
128                     q.push(nextt);
129                 }
130             }
131 
132             vol=n-now.b;
133             if(vol!=0){
134                 if(now.c>=vol){
135                     nextt.b=n;
136                     nextt.c=now.c-vol;
137                     nextt.a=now.a;
138                     nextt.countt=now.countt+1;
139                 }else{
140                     nextt.b=now.b+now.c;
141                     nextt.c=0;
142                     nextt.a=now.a;
143                     nextt.countt=now.countt+1;
144                 }
145                 if(!visit[nextt.a][nextt.b][nextt.c]){
146                     visit[nextt.a][nextt.b][nextt.c]=1;
147                     q.push(nextt);
148                 }
149             }
150         }
151     }
152     return 0;
153 }
154 
155 int main()
156 {
157     while(~scanf("%d %d %d",&s,&n,&m)){
158         memset(visit,0,sizeof(visit));
159         if(s==0&&m==0&&n==0){break;}
160         if(m==n){
161             printf("1\n");
162         }else if(s&1==1){
163             printf("NO\n");
164         }else{
165             c1.a=s; c1.b=0; c1.c=0; c1.countt=0;
166             int countt=bfs(c1);
167             if(countt==0){
168                 printf("NO\n");
169             }else{
170                 printf("%d\n",countt);
171             }
172         }
173     }
174     return 0;
175 }
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27179557/article/details/79962843

WinCVS与CVSNT简明使用手则(一)

  WinCVS与CVSNT简明使用手则(作者:Jackey,网址:www.kuihua.net)1       前言:CVS是版本控制的利器,目前在Linux和Windows下都有不同版本;但是国内...
  • ycw
  • ycw
  • 2003-12-29 12:20:00
  • 6485

HDU 1495 非常可乐(BFS+模拟)

题目链接:点击打开链接    题目大意:中文题就不解释了。 题目思路:我们有明确的初始状态(s=s,a=0,b=0)和终止状态(s=s>>1,a=s>>1,b=0) (PS:a为大号杯) 而每一...
  • u013519226
  • u013519226
  • 2015-01-21 21:27:04
  • 3078

HDU1495 非常可乐(BFS)

题目点我点我点我 题目大意:两个人分可乐,要求一人一半。(注意,是总量的一半,如:第二个样例,4->3,3->1,1->4,这样体积为4的和体积为3的容器里各有2体积的可乐) 思路:裸BFS,预处理一...
  • L954688947
  • L954688947
  • 2016-01-28 12:51:03
  • 597

HDU 1495 非常可乐(数论)

Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和s...
  • V5ZSQ
  • V5ZSQ
  • 2016-08-02 20:06:13
  • 5275

HDU1495 非常可乐(bfs/数论(不过数论的我不会))

非常可乐(bfs/数论) 数论链接 http://www.cnblogs.com/ECJTUACM-873284962/p/6750320.html#undefined 题目链接...
  • qq_37852650
  • qq_37852650
  • 2017-09-14 12:27:27
  • 171

【杭电oj】1495 - 非常可乐(bfs,队列)

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • wyg1997
  • wyg1997
  • 2016-03-28 23:34:50
  • 758

hdu1495(非常可乐 dfs)

题目链接 这题题意真让我想到小时候做过的脑筋急转弯,讲的是给你三个杯子,第一个杯子大小是后两个杯子大小之和,且第一个杯子开始是满的,其他两个是空的,问你经过多少次倒来倒去,能够是两个杯子里一样多平分...
  • yexiaohhjk
  • yexiaohhjk
  • 2015-05-26 22:43:08
  • 625

杭电1495 非常可乐(BFS过)简单搜索

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub...
  • mengxiang000000
  • mengxiang000000
  • 2015-12-27 12:34:18
  • 1430

hdu 1495 非常可乐(规律&BFS)

#include #include #include using namespace std; int gcd(int a,int b){ return !b?a:gcd(b,a%b); }...
  • u013365671
  • u013365671
  • 2014-08-06 21:05:36
  • 928

HDU1495 非常可乐【倒水问题+BFS】

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi...
  • tigerisland45
  • tigerisland45
  • 2016-08-15 01:54:28
  • 1693
收藏助手
不良信息举报
您举报文章:HDU - 1495 非常可乐(bfs)
举报原因:
原因补充:

(最多只允许输入30个字)