码迷,mamicode.com
首页 > 其他好文 > 详细

队列,广搜 nyoj 21 三个水杯

时间:2015-04-06 17:23:48      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:广搜   stl   队列   

三个水杯

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
2
6 3 1
4 1 1
9 3 2
7 1 1
样例输出
3
-1
来源
经典题目
上传者

hzyqazasdf


参考链接:

http://blog.csdn.net/code_pang/article/details/7802944

http://www.cnblogs.com/jiaolinfengacm/archive/2011/12/15/2288334.html

代码如下:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct {
	int cur[3];
	int vol[3];
	int step;
}node;
node begin,end;
bool visit[1000100];
queue<node>q;
int find(node u,node v)
{
	return (u.cur[0]==v.cur[0]&&u.cur[1]==v.cur[1]&&u.cur[2]==v.cur[2]);
}
int check(node u)
{
	return (u.cur[0]*10000+u.cur[1]*100+u.cur[2]);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&begin.vol[0],&begin.vol[1],&begin.vol[2]);
		begin.cur[0]=begin.vol[0];
		begin.cur[1]=begin.cur[2]=0;
		scanf("%d%d%d",&end.cur[0],&end.cur[1],&end.cur[2]);
		memset(visit,0,sizeof(visit));
		q.push(begin);
		visit[check(begin)]=1;
		int ok=0;
		while(!q.empty())
		{
			node u=q.front();
			q.pop();
			if(find(u,end))
			{
				ok=1;
				printf("%d\n",u.step);
				break;
			}
			for(int i=0;i<=2;++i)
			{
				for(int j=0;j<=2;++j)
				{
					if(i!=j)
					{
						int min=u.vol[j]-u.cur[j];//允许的剩余空间
						if(min>u.cur[i])
						min=u.cur[i];//防止出现负值
						node v=u;
						v.cur[i]-=min;
						v.cur[j]+=min;
						v.step=u.step+1;
						if(!visit[check(v)])
						{
							visit[check(v)]=1;
							q.push(v);
						}
					}
				}
			}
		}
		if(!ok)
		{
			printf("-1\n");
		}
	//	while(!q.empty())
	//	q.pop();
	}
	return 0;
}



队列,广搜 nyoj 21 三个水杯

标签:广搜   stl   队列   

原文地址:http://blog.csdn.net/ice_alone/article/details/44902217

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!