HDU 1495 喝可乐(暴力BFS)

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

Input:

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output:

如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input:

7 4 3
4 1 3
0 0 0

Sample Output:

NO
3

这个题吧,就是把六种情况进行模拟知道得到结果,当然也可能没有结果。

六种情况:

从S倒cola到N,从S倒colaM,从N倒cola到M,从M倒cola到N,从N倒cola到S,从M倒cola到S。

关键是用一个二维或三维(推荐二维)数组去记录状态,否则很容易超内存。

废话不多说,上代码:

#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>

using namespace std;

int S,N,M;
struct D
{
	int TM,TS,TN,t;
};
bool book[105][105]; //标记状态 


int BFS()
{
	queue<D>Q;
	D first;
	first.TS = S,first.TN = 0,first.TM = 0,first.t = 0;
	Q.push(first);
	while(!Q.empty())
	{
		D mid = Q.front();
		if(mid.TS == mid.TN && mid.TM == 0)
		{
			return mid.t;
		}
		Q.pop();
		if(mid.TN<N) //S->N
		{
			D midd = mid;
			if(mid.TS>N-mid.TN)
			{
				midd.TS -= N-midd.TN;
				midd.TN = N;
				midd.t++;
				if(book[midd.TN][midd.TM] == false)//判断,如果没出现过再往下 
				{
					Q.push(midd);
					book[midd.TN][midd.TM] = true;
				}
			}
		}
		if(mid.TM<M) //S->M
		{
			D midd = mid;
			if(mid.TS>M-mid.TM)
			{
				midd.TS -= M-midd.TM;
				midd.TM = M;
				midd.t++;
				if(book[midd.TN][midd.TM] == false)
				{
					Q.push(midd);
					book[midd.TN][midd.TM] = true;
				}
			}
		}
		if(mid.TN) //N->S
		{
			D midd = mid;
			midd.TS += midd.TN;
			midd.TN = 0;
			midd.t++;
			if(book[midd.TN][midd.TM] == false)
			{
				Q.push(midd);
				book[midd.TN][midd.TM] = true;
			}
		}
		if(mid.TM) //M->S
		{
			D midd = mid;
			midd.TS += midd.TM;
			midd.TM = 0;
			midd.t++;
			if(book[midd.TN][midd.TM] == false)
			{
				Q.push(midd);
				book[midd.TN][midd.TM] = true;
			}
		}
		if(mid.TM<M && mid.TN)     //N->M
		{
			D midd = mid;
			if(midd.TN>=M-midd.TM)
			{
				midd.TN -= M-midd.TM;
				midd.TM = M;
			}
			else
			{
				midd.TM += midd.TN;
				midd.TN = 0;
			}
			midd.t++;
			if(book[midd.TN][midd.TM] == false)
			{
				Q.push(midd);
				book[midd.TN][midd.TM] = true;
			}
		}
		if(mid.TN<N && mid.TM)    //M->N
		{
			D midd = mid;
			if(midd.TM>=N-midd.TN)
			{
				midd.TM -= N-midd.TN;
				midd.TN = N;
			}
			else
			{
				midd.TN += midd.TM;
				midd.TM = 0;
			}
			midd.t++;
			if(book[midd.TN][midd.TM] == false)Q.push(midd);
			book[midd.TN][midd.TM] = true;
		}
	}
	return -1;//没有返回-1 
}

int main()
{
	while(scanf("%d %d %d",&S,&N,&M) && S|N|M)
	{
		if(S&1)//S是奇数就过。 
		{
			printf("NO
");
			continue;
		}
		memset(book,false,sizeof(book));
		book[0][0] = true;
		if(M>N)
		{
			int mid = N;
			N = M;
			M = mid;
		}
		int T = BFS();
		if(T == -1)printf("NO
");
		else printf("%d
",T);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/vocaloid01/p/9514312.html