POJ-3414-Pots

378 篇文章 0 订阅

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值