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;
}