题目链接:http://poj.org/problem?id=3414
转载自:http://blog.csdn.net/sunacmer/article/details/3945312
分析:这是一个bfs题目,但是不一定要像传统的bfs一样,否则要写很多行,这个题目非常灵活。
代码如下:
#include<cstdio>
int A,B,C;//容量
char que[5000][11]; //路径保存数组
char que2[5000][11];
int cnt,cnt2;
int main()
{
int a,b;
while(~scanf("%d%d%d",&A,&B,&C))
{
int t2=A>B?A:B; int t1=A+B-t2;
if(t2%t1==0 && C%t1!=0)
printf("impossible\n");
else
{
a=b=cnt=0;
while(a!=C && b!=C)
{
if(b==0)
sscanf("FILL(2)\n","%s",que[cnt++]),b=B;
else{
if(a==A)
sscanf("DROP(1)\n","%s",que[cnt++]),a=0;
else{
sscanf("POUR(2,1)\n","%s",que[cnt++]);
int tt=b;
b-=A-a;//b瓶子当前量-a瓶子剩余容量,凑出新的b
if(b<0) b=0;//b倒空了
a+=tt;
if(a>A) a=A;//a倒满了
}
}
}
a=b=cnt2=0;
while(a!=C && b!=C)
{
if(a==0)
sscanf("FILL(1)\n","%s",que2[cnt2++]),a=A;
else{
if(b==B)
sscanf("DROP(2)\n","%s",que2[cnt2++]),b=0;
else{
sscanf("POUR(1,2)\n","%s",que2[cnt2++]);
int tt=a;
a-=B-b;
if(a<0) a=0;
b+=tt;
if(b>B) b=B;
}
}
}
printf("%d\n",cnt<cnt2?cnt:cnt2);
if(cnt<cnt2)
for(int i=0;i<cnt;i++)
printf("%s\n",que[i]);
else
for(int i=0;i<cnt2;i++)
printf("%s\n",que2[i]);
}
}
return 0;
}