zoukankan      html  css  js  c++  java
  • HDU 1495 非常可乐(枚举+DFS)

    非常可乐

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


    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
     
    Author
    seeyou
     
    Source
     
    Recommend
    LL
     
    题意:如题
    分析:把三个瓶子可能的情况枚举出来,再进行搜索,s为奇数时不能平分。
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<stdlib.h>
    #include<algorithm>
    #define LL __int64
    using namespace std;
    const int MAXN=100+5;
    const int INF=0x3f3f3f3f;
    int s,n,m,av,ans;
    int vis[MAXN][MAXN][MAXN];
    bool flag;
    
    void DFS(int x,int y,int z,int cur)
    {
        if((x==av && y==av) || (x==av && z==av) || (y==av && z==av))
        {
            flag=true;
            ans=min(ans,cur);
            return ;
        }
        //x->y
        if(x>0 && y<n)
        {
            int t=min(x,n-y);
            if(!vis[x-t][y+t][z])
            {
                vis[x-t][y+t][z]=1;
                DFS(x-t,y+t,z,cur+1);
                vis[x-t][y+t][z]=0;
            }
    
        }
        //x->z
        if(x>0 && z<m)
        {
            int t=min(x,m-z);
            if(!vis[x-t][y][z+t])
            {
                vis[x-t][y][z+t]=1;
                DFS(x-t,y,z+t,cur+1);
                vis[x-t][y][z+t]=0;
            }
        }
        //y->x
        if(y>0 && x<s)
        {
            int t=min(y,s-x);
            if(!vis[x+t][y-t][z])
            {
                vis[x+t][y-t][z]=1;
                DFS(x+t,y-t,z,cur+1);
                vis[x+t][y-t][z]=0;
            }
        }
        //y->z
        if(y>0 && z<m)
        {
            int t=min(y,m-z);
            if(!vis[x][y-t][z+t])
            {
                vis[x][y-t][z+t]=1;
                DFS(x,y-t,z+t,cur+1);
                vis[x][y-t][z+t]=0;
            }
        }
        //z->x
        if(z>0 && x<s)
        {
            int t=min(z,s-x);
            if(!vis[x+t][y][z-t])
            {
                vis[x+t][y][z-t]=1;
                DFS(x+t,y,z-t,cur+1);
                vis[x+t][y][z-t]=0;
            }
        }
        //z->y
        if(z>0 && y<n)
        {
            int t=min(z,n-y);
            if(!vis[x][y+t][z-t])
            {
                vis[x][y+t][z-t]=1;
                DFS(x,y+t,z-t,cur+1);
                vis[x][y+t][z-t]=0;
            }
        }
    }
    int main()
    {
        while(scanf("%d %d %d",&s,&n,&m) && (s||n||m))
        {
            if(s%2) {printf("NO
    ");continue;}
            if(n<m) swap(n,m);
            ans=INF;
            vis[s][0][0]=1;
            av=s/2;
            flag=false;
            memset(vis,0,sizeof(vis));
            DFS(s,0,0,0);
            if(flag) printf("%d
    ",ans);
            else printf("NO
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    1.18
    人月神话读后感
    疯狂学java的第45天
    学Java的第46天
    JAVA学习日记150720
    JAVA学习日记140719
    JAVA学习日记160721
    JAVA学习日记130718
    Windows DOS窗体下Oracle 数据库的导入导出(IMP/EXP)命令
    IntelliJ IDEA自动清除没用的import
  • 原文地址:https://www.cnblogs.com/clliff/p/4667817.html
Copyright © 2011-2022 走看看