zoukankan      html  css  js  c++  java
  • HDOJ1495(倒水BFS)

    非常可乐

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


    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
     
    思路:水杯A向水杯B到水的经典公式。 mn=min(B-now.b,now.a),na=now.a-mn,nb=now.b+mn.
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    using namespace std;
    const int MAXN=105;
    struct Node{
        int s,n,m;
        int step;
        Node(){}
        Node(int cs,int cn,int cm,int cstep)
        {
            s=cs;
            n=cn;
            m=cm;
            step=cstep;
        }
    };
    int vis[MAXN][MAXN][MAXN];
    int S,N,M;
    void bfs()
    {
        queue<Node> que;
        que.push(Node(S,0,0,0));
        vis[S][N][M]=1;
        while(!que.empty())
        {
            Node now=que.front();que.pop();
            if((now.s==0&&now.n==now.m)||(now.n==0&&now.s==now.m)||(now.m==0&&now.s==now.n))
            {
                printf("%d
    ",now.step);
                return ;
            }
            int nes,nen,nem,mn;
            mn=min(N-now.n,now.s);
            nes=now.s-mn;
            nen=now.n+mn;
            nem=now.m;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
    
            mn=min(M-now.m,now.s);
            nes=now.s-mn;
            nen=now.n;
            nem=now.m+mn;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
            
            mn=min(S-now.s,now.n);
            nes=now.s+mn;
            nen=now.n-mn;
            nem=now.m;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
            
            mn=min(M-now.m,now.n);
            nes=now.s;
            nen=now.n-mn;
            nem=now.m+mn;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
            
            mn=min(S-now.s,now.m);
            nes=now.s+mn;
            nen=now.n;
            nem=now.m-mn;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
            
            mn=min(N-now.n,now.m);
            nes=now.s;
            nen=now.n+mn;
            nem=now.m-mn;
            if(!vis[nes][nen][nem])
            {
                vis[nes][nen][nem]=1;
                que.push(Node(nes,nen,nem,now.step+1));
            }
        }
        printf("NO
    ");
    }
    int main()
    {
        while(scanf("%d%d%d",&S,&N,&M)!=EOF&&S&&N&&M)
        {
            memset(vis,0,sizeof(vis));
            if(S%2!=0)
            {
                printf("NO
    ");
            }
            else    bfs();
        }
        return 0;
    }
     
  • 相关阅读:
    pads layout模块复用-两个不同功能的复用模块功能
    摘抄:一个电容都能讲得如此全面实用,不分享就太可惜了!
    layout需要非常了解清楚的内容
    摘抄:一篇文章看看能不能讲透“阻抗匹配”
    python2.7/3.7安装NumPy函数库的一种方法及小心得
    3.C#基础之基本概念(完成)
    2.C#基础之词法结构(完成)
    .NET、.NET框架、ASP.NET和C#的关系(完成)
    1.C#基础之简介(完成)
    2.LINQ(新手写的!新手写的!新手写的!)(未完成)
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5016931.html
Copyright © 2011-2022 走看看