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;
    }
     
  • 相关阅读:
    小峰视频十三:二维数组
    小峰视频十二:java数组
    小峰视频十一:循环结构的跳出
    小峰视频十:循环while、for
    小峰视频九:选择语句if、switch
    小峰视频八:逻辑运算符、关系运算符、三门运算符
    小峰视频七:数据类型转换、数据运算
    eggjs+vue实现下载图片 js下载网络图片
    报错/Warning: You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored
    React/事件系统
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5016931.html
Copyright © 2011-2022 走看看