G

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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
 
简单的BFS,模拟倒水,(相当于枚举)
 
  1 #include<cstdio>
  2 #include<string.h>
  3 using namespace std;
  4 int s,n,m,pre[1000005][3],ans[1000005];
  5 int vis[120][120];
  6 int ans1;
  7 void bfs()
  8 {
  9     int first=0,end=0,a,b,c;
 10     pre[end][0]=s;
 11     pre[end][1]=0;
 12     pre[end++][2]=0;
 13     vis[s][0]=1;
 14     while(first<end)
 15     {
 16         a=pre[first][0];
 17         b=pre[first][1];
 18         c=pre[first][2];
 19         if((a==b&&c==0)||(a==c&&b==0)||(b==c&&a==0))
 20         {
 21             ans1 =ans[first];
 22             return;
 23         }
 24     int a1,b1,c1;
 25         if(a+b>=n)
 26         {
 27             a1=a+b-n;
 28             b1=n;
 29             c1=c;
 30         }
 31         else{
 32             b1=a+b;
 33             a1=0;
 34             c1=c;
 35         }
 36         if(vis[a1][b1]==0)
 37         {
 38             vis[a1][b1]=1;
 39             pre[end][0]=a1;
 40             pre[end][1]=b1;
 41             pre[end][2]=c1;
 42             ans[end++]=ans[first]+1;
 43         }
 44         if(a+c>=m)
 45         {
 46             a1=a+c-m;
 47             c1=m;
 48             b1=b;
 49         }
 50         else{
 51             c1=a+c;
 52             a1=0;
 53             b1=b;
 54         }
 55         if(vis[a1][b1]==0)
 56         {
 57             vis[a1][b1]=1;
 58             pre[end][0]=a1;
 59             pre[end][1]=b1;
 60             pre[end][2]=c1;
 61             ans[end++]=ans[first]+1;
 62         }
 63         if(b+a>=s)
 64         {
 65             a1=s;
 66             b1=0;
 67             c1=c;
 68         }
 69         else{
 70             a1=a+b;
 71             b1=0;
 72             c1=c;
 73         }
 74          if(vis[a1][b1]==0)
 75         {
 76             vis[a1][b1]=1;
 77             pre[end][0]=a1;
 78             pre[end][1]=b1;
 79             pre[end][2]=c1;
 80             ans[end++]=ans[first]+1;
 81         }
 82         if(b+c>=m)
 83         {
 84             b1=b+c-m;
 85             c1=m;
 86             a1=a;
 87         }
 88         else{
 89             c1=b+c;
 90             b1=0;
 91             a1=a;
 92         }
 93          if(vis[a1][b1]==0)
 94         {
 95             vis[a1][b1]=1;
 96             pre[end][0]=a1;
 97             pre[end][1]=b1;
 98             pre[end][2]=c1;
 99             ans[end++]=ans[first]+1;
100         }
101         if(c+a>=s)
102         {
103             a1=s;
104             c1=0;
105             b1=b;
106         }
107         else{
108             a1=a+c;
109             c1=0;
110             b1=b;
111         }
112          if(vis[a1][b1]==0)
113         {
114             vis[a1][b1]=1;
115             pre[end][0]=a1;
116             pre[end][1]=b1;
117             pre[end][2]=c1;
118             ans[end++]=ans[first]+1;
119         }
120         if(c+b>=n)
121         {
122             c1=c+b-n;
123             b1=n;
124             a1=a;
125         }
126         else{
127             b1=b+c;
128             c1=0;
129             a1=a;
130         }
131          if(vis[a1][b1]==0)
132         {
133             vis[a1][b1]=1;
134             pre[end][0]=a1;
135             pre[end][1]=b1;
136             pre[end][2]=c1;
137             ans[end++]=ans[first]+1;
138         }
139         first++;
140     }
141 
142 }
143 int main()
144 {
145     while(scanf("%d %d %d",&s,&n,&m)&&(s+n+m))
146     {
147         if(s%2)
148         {
149             printf("NO
");
150             continue;
151         }
152         ans1=0;
153         memset(vis,0,sizeof(vis));
154         bfs();
155         if(ans1) printf("%d
",ans1);
156         else printf("NO
");
157     }
158     return 0;
159 }
原文地址:https://www.cnblogs.com/angledamon/p/3932579.html