ZOJ 1005 Jugs 杯子倒水问题

    技术2024-03-27  15

    本算法思想来源于http://hi.baidu.com/racebug/blog/item/c619cfb409f75dc736d3ca2f.html。非常清晰

       遍历方法为:           循环开始                   if(小桶空)    then 倒满小桶 (fill 小桶)                   将小桶的水倒入大桶,直到小桶空或大桶满 (pour 小桶 大通)                   if(大桶的水 == 所求的体积) then 跳出循环 (success)                   if(大桶满了) then 清空大桶 (empty 大桶)

     

    #include<stdio.h> int main() { int Ca, Cb, N; int waterInA, waterInB; int temp; char a, b; while(scanf("%d %d %d", &Ca, &Cb, &N) != EOF) { if(Ca < Cb) { a = 'A'; b = 'B'; } else { a = 'B'; //a,Ca代表两个杯子中较小的 b = 'A'; temp = Ca; Ca = Cb; Cb = temp; } waterInA = 0; waterInB = 0; while (true) { if(waterInA == 0) { printf("fill %c/n", a); waterInA = Ca; } printf("pour %c %c/n", a, b); if(waterInA + waterInB > Cb) { temp = waterInB; waterInB = Cb; waterInA -= (waterInB - temp); } else { waterInB += waterInA; waterInA = 0; } if(waterInB == N) break; if(waterInB == Cb) { printf("empty %c/n", b); waterInB = 0; } } printf("success/n"); } return 0; }  

     

    别有一算法如下:

    本质上这个算法和上面的一个算法一样。也来源于网上。本人修改加注释,使其通俗易懂

    #include <stdio.h> int main() { int Ca,Cb,N; int waterInA,waterInB; int fixedWaterInB; int i; /* *输入约定: *0 < Ca <= Cb *and N <= Cb *and Ca和Cb互质. */ while (scanf("%d%d%d",&Ca,&Cb,&N) != EOF) { fixedWaterInB = 0; waterInA = waterInB = 0; while (true) { for (i=0; i<=(Cb-fixedWaterInB)/Ca; i++) { //循环结束后,b杯一定是满的 printf ("fill A/n"); printf ("pour A B/n"); waterInB += Ca; if (waterInB == N)break; //得到结果,退出循环。这里只是退出for,下面还要退出while } if (waterInB == N) break;//得到结果,退出循环。上面已退出for,这里退出while /* *含义:fixedWaterInB为b杯中本来已有的水; *(Cb - fixedWaterInB) % ca表示倒入最后满杯水a之前,b中还能放水的体积。 *如此,ca - (Cb - fixedWaterInB) % ca就表示向b中倒入最后满杯水a后,a中剩余的水 */ waterInA = Ca - (Cb - fixedWaterInB) % Ca;//整个循环就为了得到这个结果 printf ("empty B/n"); //循环后,没找到结果的b杯一定是满的 printf ("pour A B/n"); waterInB = waterInA; fixedWaterInB = waterInB;//b杯中固有的水为waterInB,即每一次while循环中b中固有的水 if(waterInB == N) break; } printf ("success/n"); } return 0; }  

     

    最新回复(0)