POJ 3414

bfs不解释

#include <stdio.h>
#define maxn 101
int visit[maxn][maxn];
int vol[2];//容量
int c;
int flag;
typedef struct TNode//定义状态
{
	int cop[2];
	int fa;//父节点
	int dis;//距离
	int op;//操作
}Node;
Node node[maxn*maxn];
void printPath(int tem)//递归打印操作
{
	if(node[tem].op!=-1)
		printPath(node[tem].fa);
	if(node[tem].op!=-1){
	int i=node[tem].op/10;
	int j=node[tem].op%10;
	int k=(j==0?1:0);
	j+=1;
	k+=1;
	if(i==0)
	{
		printf("FILL(%d)\n",j);
	}
	else if(i==1)
	{
		printf("DROP(%d)\n",j);
	}
	else
	{
		printf("POUR(%d,%d)\n",j,k);
	}
	return;}
}
void bfs()
{
	int font=0,rear=1;
	node[font].cop[0]=node[font].cop[1]=node[font].fa=node[font].dis=0;
	node[font].op=-1;
	visit[node[font].cop[0]][node[font].cop[1]]=1;
	while(font<rear)
	{
		Node &u=node[font];
		if(node[font].cop[0]==c||node[font].cop[1]==c){
			flag=1;
			printf("%d\n",node[font].dis);
			printPath(font);
			return;
		}
		int i,j;
		for(i=0;i<3;i++)//3种操作
		{
			for(j=0;j<2;j++)//操作的对象
			{
				Node &v=node[rear];
				v.cop[0]=u.cop[0];
				v.cop[1]=u.cop[1];
				if(i==0)
				{
					 v.cop[j]=vol[j];
				}
				else if(i==1)
				{
					v.cop[j]=0;
				}
				else
				{
					int k=(j==0?1:0);
					int amount=(v.cop[j]<(vol[k]-v.cop[k])?v.cop[j]:(vol[k]-v.cop[k]));
					v.cop[j]-=amount;
					v.cop[k]+=amount;
				}
				if(!visit[v.cop[0]][v.cop[1]])
				{
					visit[v.cop[0]][v.cop[1]]=1;
					v.fa=font;
					v.dis=u.dis+1;
					v.op=i*10+j;
					rear++;
				}
			}
		}
		font++;
	}
}
int main()
{
	while(scanf("%d",&vol[0])!=EOF)
	{
		flag=0;
		scanf("%d %d" ,&vol[1],&c);
		bfs();
		if(!flag)
		{
			printf("impossible\n");
		}
	}
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值