POJ 1606 && HDU 1415 Jugs(机智)

470 篇文章 3 订阅
256 篇文章 0 订阅

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值