POJ 1606 && HDU 1415 Jugs(机智)

来源:互联网 发布:java聊天室的代码 编辑:程序博客网 时间:2024/05/18 00:17

Description
给你两个容器,求出获得指定量水的步骤
三个操作
fiil A;将A容器装满水
empty A;将A容器中的水倒出
pour A B:将A容器中的水全部倒入B容器中
Input
多组输入,每组用例包括三个整数a,b,c分别表示两个容器的容量和目标容量,以文件尾结束输入(a,b互素)
Output
对于每组用例,输出获得C体积水的步骤,如果不存在可行解则输出impossible
Sample Input
3 5 4
5 7 3
Sample Output
fill B
pour B A
empty A
pour B A
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
empty B
pour A B
success
Solution
经典倒水问题,由ax+by=gcd(x,y)知对A,B两个水桶进行一系列灌水倒水操作后一定可以得到gcd(a,b)的水量,此处因为a,b互素,所以一定可以经过一系列操作得到一单位的水,那么得到c单位的水只需要重复操作即可。对于具体操作,每次只需灌满小桶,然后用小桶往大桶倒水,大桶满了就倒掉,当两个桶中有一个桶的水量达到目标水量时退出循环即可
Code

#include<stdio.h>int main(){    int a,b,c,x,y;    while(~scanf("%d%d%d",&a,&b,&c))    {        if(b==c)//B桶容量即为目标水量,灌满B桶即可         {             printf("fill B\n");        }        else if(a==c)//A桶容量为目标水量,因为要在B桶达到目标水量所以先灌满A桶然后将A桶中的水倒入B桶         {            printf("fill A\n");            printf("pour A B\n");        }        else        {            x=y=0;            if(a<c)//当A桶容量小于目标容量时采取灌B桶倒A桶策略             {                while(1)                {                     if(y==0)                    {                        y=b;                        printf("fill B\n");                    }                    if(y>a-x)//B桶水量大于当前A桶容纳量则将A桶倒满                     {                        y-=a-x;                        x=a;                        printf("pour B A\n");                    }                    else//B桶水量小于当前A桶容纳量则将B桶水全部倒入A桶                     {                        x+=y;                        y=0;                        printf("pour B A\n");                    }                    if(y==c)//B桶水量达到目标水量则退出循环                     {                        break;                    }                     if(a==x)//A桶已满则清空A桶                                                                                {                        x=0;                        printf("empty A\n");                    }                }            }            else//当A桶容量小于目标容量时采取灌A桶倒B桶策略             {                while(1)                {                    if(x==0)                    {                        x=a;                        printf("fill A\n");                    }                    if(x>b-y)//A桶水量大于当前B桶容纳量则将A桶倒满                                                                                               {                        x-=b-y;                        y=b;                        printf("pour A B\n");                    }                    else//A桶水量小于当前B桶容纳量则将A桶水全部倒入B桶                                                                                                              {                        y+=x;                        x=0;                        printf("pour A B\n");                    }                    if(y==c)//B桶水量达到目标水量则退出循环                                                                                                        {                        break;                    }                    if(y==b)//B桶已满则清空B桶                                                                                                {                        y=0;                        printf("empty B\n");                    }                }            }        }        printf("success\n");    }    return 0;}
0 0
原创粉丝点击