題目鏈接:http://poj.org/problem?id=3414
給出三個數,分別是第一個杯子的容量,第二個杯子的容量,以及所需的體積。
有三種操作:加水,把水倒掉,把水從一個杯子倒進另一個杯子。
就一個bfs水題。。。真的。
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈勞資終於AC了!!!!!!!!!!!
額。。。認真講就是保存操作路徑的時候不能隨便存,我用的模擬隊列,記錄前一步的in值,從後往前就可以找到路徑了。
//220K 0MS
//C++ 1581B
#include <cstring>
#include <cstdio>
int z[10001],a,b,c,k=0;
char h[6][11]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
struct node
{
int x,y,dis,z,pre;
}q[50000];
int vis[101][101];
int bfs()
{
int in=0,out=0,i;
q[in].pre=-1;
q[in].z=0;
q[in].dis=0;
q[in].x=0;
q[in++].y=0;
vis[0][0]=1;
while(in>out)
{
int j=out;
int x=q[out].x;
int y=q[out].y;
int di=q[out++].dis;
if(x==c||y==c)
{
while(q[j].pre!=-1)
{
z[k++]=q[j].z;
j=q[j].pre;
}
return di;
}
for(i=0;i<6;i++)
{
int sx=x,sy=y;
switch(i)
{
case 0:sx=a;break;
case 1:sy=b;break;
case 2:sx=0;break;
case 3:sy=0;break;
case 4:sx=x+y-b>=0?x+y-b:0;
sy=y+x>=b?b:y+x;break;
case 5:sy=x+y-a>=0?x+y-a:0;
sx=x+y>=a?a:x+y;break;
}
if(!vis[sx][sy])
{
q[in].pre=out-1;
q[in].z=i;
vis[sx][sy]=1;
q[in].dis=di+1;
q[in].x=sx;
q[in++].y=sy;
}
}
}
return 0;
}
int main()
{
scanf("%d%d%d",&a,&b,&c);
int di=bfs();
if(di)
{
printf("%d\n",di);
for(int i=k-1;i>=0;i--)
puts(h[z[i]]);
}
else
printf("impossible\n");
}