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

    题目链接

    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

    题意:
    容量分别是N 毫升和M 毫升,可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。能平分的话请输出最少要倒的次数,否则输出"NO"。

    分析:
    广搜,每一个队头元素都要进行6次操作,如图进行了n->m一次操作:

    对应的6中操作(S->N,S->M,N->S,N->M,M->S,M->N)
    此图必须注意:n,m的意思为:瓶子n中此刻存在的可乐量为n,瓶子m中此刻存在的可乐量为m

    注意:从一个瓶倒进另一个瓶时必须分两种情况,1:能装满2:不能装满

    代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    struct node
    {
        int x[3];
        int len;
    };
    
    queue<node>q;
    
    int map[101][101][101];//记录三个状态是否出现过
    
    int dx[3];//三个容器分别最多可以装多少水
    double isok;
    
    int bfs(int x,int y,int z,int xx)
    {
        memset(map,0,sizeof(map));
        while(!q.empty())
        {
            q.pop();
        }
        node p;
        p.x[0]=x;
        p.x[1]=y;
        p.x[2]=z;
        p.len=0;
        q.push(p);
        while(!q.empty())
        {
            node p=q.front();
            q.pop();
            if((p.x[0]==p.x[1]&&p.x[1]==xx)||(p.x[0]==p.x[2]&&p.x[0]==xx)||(p.x[1]==p.x[2]&&p.x[1]==xx))
            {
                return p.len;
            }
            for(int i=0; i<3; i++)
            {
                for(int j=0; j<3; j++)
                {
                    if(i==j)continue;
                    node p1;
                    if(p.x[i]<=dx[j]-p.x[j])//第j个杯子是否可以装下p.x[i]的水
                    {
                        p1.x[j]=p.x[j]+p.x[i];
                        p1.x[i]=0;
                    }
                    else//不能倒下p.x[i]的水。则倒一部分进去
                    {
                        p1.x[i]=p.x[i]-(dx[j]-p.x[j]);
                        p1.x[j]=dx[j];
                    }
                    for(int k=0; k<3; k++)
                    {
                        if(k!=i&&k!=j)
                        {
                            p1.x[k]=p.x[k];
                        }
                    }
                    p1.len=p.len;
                    if(map[p1.x[0]][p1.x[1]][p1.x[2]]==1)
                        continue;
                    map[p1.x[0]][p1.x[1]][p1.x[2]]=1;
                    p1.len++;
                    q.push(p1);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int s,n,m;
        while(~scanf("%d%d%d",&s,&n,&m))
        {
            if(s==0&&n==0&&m==0)break;
            if(s%2)//可乐总体积是奇数的话,肯定是不能够平分的
            {
                printf("NO
    ");
            }
            else
            {
                dx[0]=s,dx[1]=n,dx[2]=m;
                int re=bfs(s,0,0,s/2);
                if(re==-1)
                    printf("NO
    ");
                else
                    printf("%d
    ",re);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    POJ 1811 Prime Test 素性测试 分解素因子
    sysbench的安装与使用
    电脑中已有VS2005和VS2010安装.NET3.5失败的解决方案
    I.MX6 show battery states in commandLine
    RPi 2B Raspbian system install
    I.MX6 bq27441 driver porting
    I.MX6 隐藏电池图标
    I.MX6 Power off register hacking
    I.MX6 Goodix GT9xx touchscreen driver porting
    busybox filesystem httpd php-5.5.31 sqlite3 webserver
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7611273.html
Copyright © 2011-2022 走看看