ZOJ 1005

还是搜索的问题,只是每次的选择有四种,要根据情况判断!

#include <stdio.h>
#define PATOB 1
#define PBTOA 2
#define FA 3
#define FB 4
#define EA 5
#define EB 6

typedef struct 
{
	int act;
	int former;
	int a;
	int b;
}node;

int a,b,n;

int ret(node *str,int pos);

int main(int argc, char *argv[])
{
	int i;
	while((scanf("%d %d %d",&a,&b,&n))!=EOF)
	{
		int now = 0;
		int tail = 2;
		node str[100000]={0};
		int stack[1000]={0};
		str[0].act = FA;
		str[1].act = FB;
		str[0].former = str[1].former = -1;
		str[0].a = a;
		str[0].b = 0;
		str[1].a = 0;
		str[1].b = b;
		
		while(str[now].b!=n)
		{
			if(str[now].a!=0&&str[now].b!=b)
			{
				str[tail].act = PATOB;
				str[tail].former = now;
				if(str[now].a + str[now].b <= b)
				{
					str[tail].a = 0;
					str[tail].b = str[now].a + str[now].b;
				}
				else
				{
					str[tail].a = str[now].a + str[now].b - b;
					str[tail].b = b;
				}
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			if(str[now].b!=0&&str[now].a!=a)
			{
				str[tail].act = PBTOA;
				str[tail].former = now;
				if(str[now].b + str[now].a <= a)
				{
					str[tail].b = 0;
					str[tail].a = str[now].b + str[now].a;
				}
				else
				{
					str[tail].b = str[now].b + str[now].a - a;
					str[tail].a = a;
				}
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			if(str[now].a < a)
			{
				str[tail].a = a;
				str[tail].b = str[now].b;
				str[tail].former = now;
				str[tail].act = FA;
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			if(str[now].b < b)
			{
				str[tail].b = b;
				str[tail].a = str[now].a;
				str[tail].former = now;
				str[tail].act = FB;
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			if(str[now].a!=0)
			{
				str[tail].a = 0;
				str[tail].b = str[now].b;
				str[tail].former = now;
				str[tail].act = EA;
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			if(str[now].b!=0)
			{
				str[tail].b = 0;
				str[tail].a = str[now].a;
				str[tail].former = now;
				str[tail].act = EB;
				if(ret(str,tail)!=0)
				{
					tail++;
				}
			}
			now++;
		}
		for(i = 0;now >= 0;i++)
		{
			stack[i] = now;
			now = str[now].former;
		}
		i--;
		while(i>=0)
		{
			int t = str[stack[i]].act;
			switch(t)
			{
				case PATOB:printf("pour A B\n");break;
				case PBTOA:printf("pour B A\n");break;
				case FA:printf("fill A\n");break;
				case FB:printf("fill B\n");break;
				case EA:printf("empty A\n");break;
				case EB:printf("empty B\n");break;
				default:break;
			}
			i--;
		}
		printf("success\n");
	}
	return 0;
}

int ret(node *str,int pos)            //很重要!!!不然会超时
{
	int i;
	int flag = 1;
	for(i = 0;i < pos;i++)
	{
		if(str[i].a==str[pos].a&&str[i].b==str[pos].b)
		{
			flag = 0;
			break;
		}
	}
	return flag;
}

还有一点要注意的是,如果你不加判断的搜索的话还是会超时的,要判断进行操作后出现的状态是否在之前出现过,如果出现过,这种情况就不要考虑了,不然会造成重复!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值