这个题属于BFS,题不难,只是状态记录有点麻烦,而且得细心。
我做这个题因为一个地方a写成b,导致一直WA~唉,看来下次还是得细心点。
代码:
#include<cstdio>
#include<cstring>
struct node
{
int op,index;
int a,b;
int one,two;
int step;
}q[100110];
int a,b,c,ans,pre,last,ansa[1000],ansb[1000],ansc[1000];
bool vis[101][101];
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
pre=last=0;
ans=-1;
memset(vis,0,sizeof(vis));
q[last].a=0;
q[last].b=0;
q[last].index=-1;
q[last++].step=0;
while(pre<last)
{
if(q[pre].a==c||q[pre].b==c)
{
ans=q[pre].step;
int cou=0;
for(int i=pre;i!=0;i=q[i].index)
{ansa[cou]=q[i].op;ansb[cou]=q[i].one;ansc[cou++]=q[i].two;}
break;
}
if(!vis[a][q[pre].b])
{
q[last]=q[pre];
q[last].a=a;
q[last].op=1;
q[last].one=1;
q[last].index=pre;
q[last++].step=q[pre].step+1;
vis[a][q[pre].b]=1;
}
if(!vis[q[pre].a][b])
{
q[last]=q[pre];
q[last].b=b;
q[last].op=1;
q[last].one=2;
q[last].index=pre;
q[last++].step=q[pre].step+1;
vis[q[pre].a][b]=1;
}
int ita=q[pre].a;
int itb=q[pre].b;
if(ita<a)
{
if(a-ita>=itb)
{
ita+=itb;
itb=0;
}
else
{
itb-=(a-ita);
ita=a;
}
if(!vis[ita][itb])
{
node itm;
itm.op=2;
itm.a=ita;
itm.b=itb;
itm.one=2;
itm.two=1;
itm.index=pre;
itm.step=q[pre].step+1;
q[last++]=itm;
vis[ita][itb]=1;
}
}
ita=q[pre].a;
itb=q[pre].b;
if(itb<b)
{
if(b-itb>=ita)
{
itb+=ita;
ita=0;
}
else
{
ita-=(b-itb);
itb=b;
}
if(!vis[ita][itb])
{
node itm;
itm.op=2;
itm.a=ita;
itm.b=itb;
itm.one=1;
itm.two=2;
itm.index=pre;
itm.step=q[pre].step+1;
q[last++]=itm;
vis[ita][itb]=1;
}
}
if(!vis[0][q[pre].b])
{
q[last]=q[pre];
q[last].a=0;
q[last].op=3;
q[last].one=1;
q[last].index=pre;
q[last++].step=q[pre].step+1;
vis[0][q[pre].b]=1;
}
if(!vis[q[pre].a][0])
{
q[last]=q[pre];
q[last].b=0;
q[last].op=3;
q[last].one=2;
q[last].index=pre;
q[last++].step=q[pre].step+1;
vis[q[pre].a][0]=1;
}
pre++;
}
if(ans==-1)
{
printf("impossible\n");
continue;
}
printf("%d\n",ans);
for(int i=ans-1;i>=0;i--)
{
if(ansa[i]==1)
printf("FILL(%d)\n",ansb[i]);
else if(ansa[i]==2)
printf("POUR(%d,%d)\n",ansb[i],ansc[i]);
else
printf("DROP(%d)\n",ansb[i]);
}
}
return 0;
}