Jugs【ZOJ 1005题】 两水壶灌水趣题

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1005

题目刚开始引用了《虎胆龙威3》,看到电影的英文单词时,不觉虎躯一震,顿时来了兴趣,其实细数一下,虎胆龙威系列,本人觉得3是最不好看的一部,因为这部跨街区追逐战早前在另一部好莱坞电影里面看过,所谓先入为主,时间久远,也没再深入查询是A抄袭了B还是B抄袭了A,甚至我连B的电影名字都忘记了,毕竟没有大腕儿在里面,度娘也帮不上忙。

当然,没看过电影并不影响做这道题,就像没看过《Monty Python》并不影响你成为python高手一样。

两个容量分别为ca和cb的水壶,cb>=ca,无限量的水,要求用这两个水壶之间的互相灌水或清空或装满,使B水壶最终盛放的水容量为N。

乍一看样例,吓到了,两个样例的倒水方向截然相反,我以为这就是一个突破口,于是各种演算,想找出倒水的方向原则,最后晕掉了,得到的都是自相矛盾的结果,无奈,我随便写了一个样例:5,18,2。然后就有一笔没一笔的在纸上划着:如果大灌小,可以得到13,8,3,16,11,6,1,14,9,4,17,12,7,2,15,10,5.竟然,发现所有的数据都可以由大灌小得到,我又重新做了样例2,success!

所以,本题是个水题,最后得知是小学生趣味数学题一枚,只要一直按一个方向灌水,就可以得到要求的容量。

 1 #include <stdio.h>
 2 
 3 void operation(int ca, int canow, int cb, int cbnow, int n)//canow,cbnow分别代指A,B当前的水量
 4 {
 5     if(cbnow == n)
 6     {
 7         return;
 8     }
 9     else
10     {
11         if(cbnow > ca)//剩余水量比A总量还大
12         {
13             printf("pour B A\n");
14             if(cbnow - (ca - canow) == n)//害怕判题系统会认为底下一个printf多余,所以就加上了这个if语句
15             {
16                 return;
17             }
18             printf("empty A\n");
19             operation(ca, 0, cb, cbnow - (ca - canow), n);
20         }
21         else//剩余水量小于A总量,把它转移到A中保存
22         {
23             printf("pour B A\n");
24             printf("fill B\n");
25             operation(ca, cbnow, cb, cb, n);
26         }
27     }
28 }
29 
30 int main()
31 {
32    int ca, cb, n;
33    while(scanf("%d %d %d", &ca, &cb, &n) != EOF)
34    {
35     printf("fill B\n");
36     operation(ca, 0, cb, cb, n);
37     printf("success\n");
38    }
39    return 0;
40 }
原文地址:https://www.cnblogs.com/Rafy/p/3002948.html