第二周作业 Pour Water
题目:
倒水问题
“fill A” 表示倒满A杯,"empty A"表示倒空A杯,“pour A B” 表示把A的水倒到B杯并且把B杯倒满或A倒空。
输入:
输入包含多组数据。每组数据输入 A, B, C,数据范围 0 < A <= B 、C <= B <=1000 、A和B互质。
输出:
你的程序的输出将由一系列的指令组成。这些输出行将导致任何一个罐子正好包含C单位的水。每组数据的最后一行输出应该是“success”。输出行从第1列开始,不应该有空行或任何尾随空格。
样例输入:
2 7 5
2 7 4
样例输出:
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
success
最初看到这题的时候不能理解为什么能用bfs来做,后来问了下别人才理解:
可以把最初两个水杯的状态看做(0,0)点,由于是2个杯子,有6种操作:1,A倒满 2,B倒满 3,A倒空 4,B倒空 5,A倒入B 6,B倒入A;两个杯子从一个状态到另一个状态可以认为从一个点到另一个点,是依靠6种方法中的一种。如果最后能到达目标状态所代表的的点,则说明是可以依靠这六种方法倒出目标状态的水的。
设一个全局变量int table[1100][1100];
一个初始化函数init,初始化table
void init()
{
for(int i=0;i<1100;i++)
{
for(int j=0;j<1100;j++)
{
table[i][j]=0;
}
}
}
函数pour,改变两杯水的状态
node pour(int A,int B,node now,int way)
{
int a=now.a;
int b=now.b;
node next;
switch(way)
{
case 0:
a=A;//倒满A
break;
case 1:
b=B;//倒满B
break;
case 2:
a=0;
break;//清空A
case 3:
b=0;
break;//清空B
case 4:
if(a+b>A)//把B中的水倒入A中,判断是否会溢出
{
b=a+b-A;
a=A;
}
else
{
a=a+b;
b=0;
}
break;
case 5:
if(a+b>B)
{
a=a+b-B;
b=B;
}
else
{
b=a+b;
a=0;
}
break;
}
next.a=a;
next.b=b;
next.op=way;