M

  1 #include <string.h>
  2 #include <stdio.h>
  3 #include <queue>
  4 using namespace std;
  5 
  6 int s,n,m;
  7 int vis[105][105][105];
  8 
  9 struct node
 10 {
 11     int s,n,m,step;
 12 };
 13 int check(int x,int y,int z)//平分条件
 14 {
 15     if(x == 0 && y == z)
 16         return 1;
 17     if(y == 0 && x == z)
 18         return 1;
 19     if(z == 0 && x == y)
 20         return 1;
 21     return 0;
 22 }
 23 
 24 int bfs()
 25 {
 26     queue<node> Q;
 27     node a,next;
 28     a.s = s;
 29     a.n = 0;
 30     a.m = 0;
 31     a.step = 0;
 32     vis[s][0][0] = 1;
 33     Q.push(a);
 34     while(!Q.empty())
 35     {
 36         a = Q.front();
 37         Q.pop();
 38         if(check(a.s,a.n,a.m))
 39             return a.step;
 40         if(a.n)//当n杯中还有
 41         {
 42             if(a.n>s-a.s)//将n杯倒入s杯中能将s杯倒满
 43             {
 44                 next = a;
 45                 next.n = next.n-(s-a.s);
 46                 next.s = s;
 47                 if(!vis[next.s][next.n][next.m])
 48                 {
 49                     next.step = a.step+1;
 50                     Q.push(next);
 51                     vis[next.s][next.n][next.m] = 1;
 52                 }
 53             }
 54             else//将n杯倒入s杯中不能将s杯倒满
 55             {
 56                 next = a;
 57                 next.s = next.n+next.s;
 58                 next.n = 0;
 59                 if(!vis[next.s][next.n][next.m])
 60                 {
 61                     next.step = a.step+1;
 62                     Q.push(next);
 63                     vis[next.s][next.n][next.m] = 1;
 64                 }
 65             }
 66             if(a.n>m-a.m)//将n杯倒入m杯中能将m杯倒满
 67             {
 68                 next = a;
 69                 next.n = next.n-(m-a.m);
 70                 next.m =  m;
 71                 if(!vis[next.s][next.n][next.m])
 72                 {
 73                     next.step = a.step+1;
 74                     Q.push(next);
 75                     vis[next.s][next.n][next.m] = 1;
 76                 }
 77             }
 78             else//将n杯倒入m杯中不能将m杯倒满
 79             {
 80                 next = a;
 81                 next.m = next.n+next.m;
 82                 next.n = 0;
 83                 if(!vis[next.s][next.n][next.m])
 84                 {
 85                     next.step = a.step+1;
 86                     Q.push(next);
 87                     vis[next.s][next.n][next.m] = 1;
 88                 }
 89             }
 90         }
 91         if(a.m)//同上
 92         {
 93             if(a.m>s-a.s)
 94             {
 95                 next = a;
 96                 next.m = next.m-(s-a.s);
 97                 next.s = s;
 98                 if(!vis[next.s][next.n][next.m])
 99                 {
100                     next.step = a.step+1;
101                     Q.push(next);
102                     vis[next.s][next.n][next.m] = 1;
103                 }
104             }
105             else
106             {
107                 next = a;
108                 next.s = next.m+next.s;
109                 next.m = 0;
110                 if(!vis[next.s][next.n][next.m])
111                 {
112                     next.step = a.step+1;
113                     Q.push(next);
114                     vis[next.s][next.n][next.m] = 1;
115                 }
116             }
117             if(a.m>n-a.n)
118             {
119                 next = a;
120                 next.m = next.m-(n-a.n);
121                 next.n =  n;
122                 if(!vis[next.s][next.n][next.m])
123                 {
124                     next.step = a.step+1;
125                     Q.push(next);
126                     vis[next.s][next.n][next.m] = 1;
127                 }
128             }
129             else
130             {
131                 next = a;
132                 next.n = next.m+next.n;
133                 next.m = 0;
134                 if(!vis[next.s][next.n][next.m])
135                 {
136                     next.step = a.step+1;
137                     Q.push(next);
138                     vis[next.s][next.n][next.m] = 1;
139                 }
140             }
141         }
142         if(a.s)//同上
143         {
144             if(a.s>n-a.n)
145             {
146                 next = a;
147                 next.s = next.s-(n-a.n);
148                 next.n = n;
149                 if(!vis[next.s][next.n][next.m])
150                 {
151                     next.step = a.step+1;
152                     Q.push(next);
153                     vis[next.s][next.n][next.m] = 1;
154                 }
155             }
156             else
157             {
158                 next = a;
159                 next.n = next.s+next.n;
160                 next.s = 0;
161                 if(!vis[next.s][next.n][next.m])
162                 {
163                     next.step = a.step+1;
164                     Q.push(next);
165                     vis[next.s][next.n][next.m] = 1;
166                 }
167             }
168             if(a.s>m-a.m)
169             {
170                 next = a;
171                 next.s = next.s-(m-a.m);
172                 next.m =  m;
173                 if(!vis[next.s][next.n][next.m])
174                 {
175                    next.step = a.step+1;
176                     Q.push(next);
177                     vis[next.s][next.n][next.m] = 1;
178                 }
179             }
180             else
181             {
182                 next = a;
183                 next.m = next.m+next.s;
184                 next.s = 0;
185                 if(!vis[next.s][next.n][next.m])
186                 {
187                     next.step = a.step+1;
188                     Q.push(next);
189                     vis[next.s][next.n][next.m] = 1;
190                 }
191             }
192         }
193     }
194     return 0;
195 }
196 
197 int main()
198 {
199     int ans;
200     while(~scanf("%d%d%d",&s,&n,&m))
201     {
202         if(s ==0 && n ==0 &&m==0)
203             break;
204         if(s%2)
205         {
206             printf("NO
");
207             continue;
208         }
209         memset(vis,0,sizeof(vis));
210         ans = bfs();
211         if(ans)
212             printf("%d
",ans);
213         else
214             printf("NO
");
215     }
216     return 0;
217 }
原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8971462.html