• 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;
    }
    
  • 相关阅读:
    vijos 1379 字符串的展开
    BZOJ 4597 随机序列
    BZOJ 2303 方格染色
    BZOJ 2654 tree
    BZOJ 4198 荷马史诗
    BZOJ 1555 KD之死
    不重复数字
    Rails
    Train Problem I
    Key Set HDU
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514312.html
Copyright © 2020-2023  润新知