zoukankan      html  css  js  c++  java
  • (广搜)可口可乐 -- hdu -- 1495

    链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1495

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 7620    Accepted Submission(s): 3050


    Problem Description
    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    #define maxn 110
    
    struct node
    {
        int a, b, c, step;
    };
    
    int S, N, M, vis[maxn][maxn][maxn];
    
    int BFS()
    {
        node p, q;
        p.a=S, p.b=0, p.c=0, p.step=0;
    
        memset(vis, 0, sizeof(vis));
        vis[S][0][0] = 1;
    
        queue<node>Q;
        Q.push(p);
    
    
        while(Q.size())
        {
            p = Q.front(), Q.pop();
    
            if((p.a==S/2&&p.b==S/2) || (p.b==S/2&&p.c==S/2) || (p.a==S/2&&p.c==S/2)) return p.step;
    
            for(int i=0; i<6; i++)
            {
                if(i==0) /// a->b
                {
                    if(p.a+p.b>N)
                    {
                        q.a = p.a+p.b-N;
                        q.b = N;
                    }
                    else
                    {
                        q.a = 0;
                        q.b = p.a+p.b;
                    }
                    q.c = p.c;
                }
                else if(i==1) /// a->c
                {
                    if(p.a+p.b>M)
                    {
                        q.a = p.a+p.c-M;
                        q.c = M;
                    }
                    else
                    {
                        q.a = 0;
                        q.c = p.a+p.c;
                    }
                    q.b = p.b;
                }
                else if(i==2) /// b->a
                {
                    if(p.b+p.a>S)
                    {
                        q.b = p.b+p.a-S;
                        q.a = S;
                    }
                    else
                    {
                        q.b = 0;
                        q.a = p.b+p.a;
                    }
                    q.c = p.c;
                }
                else if(i==3)  /// b->c
                {
                    if(p.b+p.c>M)
                    {
                        q.b = p.b+p.c-M;
                        q.c = M;
                    }
                    else
                    {
                        q.b = 0;
                        q.c = p.b+p.c;
                    }
                    q.a = p.a;
                }
                else if(i==4) /// c->a
                {
                    if(p.c+p.a>S)
                    {
                        q.c = p.c+p.a-S;
                        q.a = S;
                    }
                    else
                    {
                        q.c = 0;
                        q.a = p.c+p.a;
                    }
                    q.b = p.b;
                }
                else if(i==5) ///  c->b
                {
                    if(p.c+p.b>N)
                    {
                        q.c = p.c+p.b-N;
                        q.b = N;
                    }
                    else
                    {
                        q.c = 0;
                        q.b = p.c+p.b;
                    }
                    q.a = p.a;
                }
                q.step = p.step+1;
                if(!vis[q.a][q.b][q.c])
                {
                    vis[q.a][q.b][q.c]=1;
                    Q.push(q);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        while(scanf("%d%d%d", &S, &N, &M), S+N+M)
        {
            if(S%2)
            {
                printf("NO
    ");
                continue;
            }
    
            int ans = BFS();
            if(ans==-1)
               printf("NO
    ");
            else
               printf("%d
    ", ans);
    
        }
        return 0;
    }
    勿忘初心
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/YY56/p/4796651.html
Copyright © 2011-2022 走看看