POJ-3414-Pots

这个题属于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;
}


你可能感兴趣的:(bfs)