-
题目描述:
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升(正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
-
输入:
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
-
输出:
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
-
样例输入:
7 4 3
4 1 3
0 0 0
-
样例输出:
NO
3
提示:可参考教程.附下载地址
http://120.192.83.81/2/file.data.vdisk.me/49948774/f0c8e4bdf58b1a80a08cbc6d675580df763b1c55?ip=1361548192,111.15.172.124&ssig=T8hG%2BSRbkr&Expires=1361546992&KID=sae,l30zoo1wmz&fn=%E3%80%8A2013%E5%B9%B4%E7%8E%8B%E9%81%93%E8%AE%BA%E5%9D%9B%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%80%83%E7%A0%94%E6%9C%BA%E8%AF%95%E6%8C%87%E5%8D%97%E3%80%8B_20130112.pdf
1 #include <cstdio> 2 #include <queue> 3 using namespace std; 4 5 bool mar[101][101][101]; 6 int S, N, M; 7 struct Sta { 8 int a, b, c, t; 9 void init(int x, int y, int z, int cost) { 10 a = x; 11 b = y; 12 c = z; 13 t = cost; 14 } 15 void mark() { 16 mar[a][b][c] = true; 17 } 18 }; 19 Sta tt, st; 20 queue<Sta> Q; 21 bool AtoB(int a, int &sa, int b, int &sb) { 22 if (b - sb >= sa) { 23 sb += sa; 24 sa = 0; 25 } else { 26 sa -= b - sb; 27 sb = b; 28 } 29 if ((tt.a == S / 2 && tt.b == S / 2) || (tt.a == S / 2 && tt.c == S / 2) || (tt.b == S / 2 && tt.c == S / 2)) 30 return true; 31 else { 32 if (!mar[tt.a][tt.b][tt.c]) { 33 tt.t++; 34 tt.mark(); 35 Q.push(tt); 36 } 37 } 38 return false; 39 } 40 41 int bfs() { 42 while (!Q.empty()) { 43 st = Q.front(); 44 Q.pop(); 45 tt = st; 46 if (AtoB(S, tt.a, N, tt.b)) 47 return tt.t + 1; 48 tt = st; 49 if (AtoB(S, tt.a, M, tt.c)) 50 return tt.t + 1; 51 tt = st; 52 if (AtoB(N, tt.b, S, tt.a)) 53 return tt.t + 1; 54 tt = st; 55 if (AtoB(N, tt.b, M, tt.c)) 56 return tt.t + 1; 57 tt = st; 58 if (AtoB(M, tt.c, S, tt.a)) 59 return tt.t + 1; 60 tt = st; 61 if (AtoB(M, tt.c, N, tt.b)) 62 return tt.t + 1; 63 } 64 return -1; 65 } 66 67 int main() { 68 while (~scanf("%d%d%d", &S, &N, &M) && !(S == 0 && N == 0 && M == 0)) { 69 if (S % 2 == 1) { 70 printf("NO\n"); 71 continue; 72 } 73 for (int i = 0; i <= S; i++) 74 for (int j = 0; j <= S; j++) 75 for (int k = 0; k <= S; k++) 76 mar[i][j][k] = false; 77 while (!Q.empty()) 78 Q.pop(); 79 tt.init(S, 0, 0, 0); 80 tt.mark(); 81 Q.push(tt); 82 int time = bfs(); 83 if (time == -1) 84 printf("NO\n"); 85 else 86 printf("%d\n", time); 87 } 88 return 0; 89 }