zoukankan      html  css  js  c++  java
  • HDU 1495 非常可乐

    非常可乐

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


    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
     




    一看是倒水的问题,毫无疑问用BFS,但是需要注意的是这个题不是分出来二分之一的总量就完事了,还要再凑出来一个二分之一的总量,这个就比较简单了,那就是在步数上加1就好。 

    然而代码太丑了。写的超级麻烦。以后绝对不这么写了。

    /*************************************************************************
    	> File Name: 非常可乐.cpp
    	> Author: Zhanghaoran0
    	> Mail: chiluamnxi@gmail.com
    	> Created Time: 2015年08月18日 星期二 08时27分37秒
     ************************************************************************/
    
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    /*
    int S, N, M;
    bool flag[105][105];
    int Max = 1000001;
    bool dfs(int x, int y, int z, int step){
        if(x == S / 2 || y == S / 2 || z == S / 2){
            Max = min(Max, step + 1); 
    	return true;
        }
        if(!flag[N][y]){
            flag[N][y] = true;
            dfs(N, y, z - x, step + 1);
            flag[N][y] = false;
        }
        if(!flag[x][M]){
            flag[x][M] = true;
            dfs(x, M, z - y, step + 1);
            flag[x][M] = false;
        }
        
        if(x != 0 || y != 0){
            if(x + y > N){
                if(!flag[N][y - (N - x)]){
                    flag[N][y - (N - x)] = true;
                    dfs(N, y - (N - x), z, step + 1);
                    flag[N][y - (N - x)] = false;
                }
            }
            else if(x + y <= N){
                if(!flag[x + y][0]){
                    flag[x + y][0] = true;
                    dfs(x + y, 0, z, step + 1);
                    flag[x + y][0] = false;
                }
            }
            if(x + y > M){
                if(!flag[x - (M - y)][M]){
                    flag[x - (M - y)][M] = true;
                    dfs(x - (M - y), M, z, step + 1);
                    flag[x - (M - y)][M] = false;
                }
                
            }
            else if(x + y <= M){
                if(!flag[0][x + y]){
                    flag[0][x + y] = true;
                    dfs(0, x + y, z, step + 1);
                    flag[0][x + y] = false;
                }
            }
    
            if(!flag[0][y]){
                flag[0][y] = true;
                dfs(0, y, z + x, step + 1);
                flag[0][y] = false;
            }
    
            if(!flag[x][0]){
                flag[x][0] = true;
                dfs(x, 0, y + z, step + 1);
                flag[x][0] = false;
            }
        }
    }
    
    
    int main(void){
        while(1){
            cin >> S >> N >> M;
            if(S == 0 && N == 0 && M == 0)
                break;
            if(S % 2){ 
                cout << "NO" << endl;
                continue;
            }
            
            memset(flag, 0, sizeof(flag));
    
            dfs(0, 0, S, 0);
            if(Max != 1000001)
                cout << Max << endl;
            else
                cout << "NO" << endl;
            Max = 1000001;
        }
        return 0;
    }
    */
    
    
    
    bool flag[105][105];
    int S, N, M;
    int goal;
    struct node{
        int nowpos[3];
        int step;
    }q[1000001];
    int ans;
    
    
    int  bfs(){
        int head = 0;
        int tail = 1;
        q[0].nowpos[0] = S;
        q[0].nowpos[1] = 0;
        q[0].nowpos[2] = 0;
        q[0].step = 0;
        flag[0][0] = true;
    
        while(head < tail){
            int num = 0;
            if(q[head].nowpos[0] == goal)
                num ++;
            if(q[head].nowpos[1] == goal)
                num ++;
            if(q[head].nowpos[2] == goal)
                num ++;
            if(num == 2)
                return q[head].step;
    
            if(q[head].nowpos[0] != 0){
                if(q[head].nowpos[0] > N - q[head].nowpos[1]){
                    q[tail].nowpos[0] = q[head].nowpos[0] - (N - q[head].nowpos[1]);
                    q[tail].nowpos[1] = N;
                    q[tail].nowpos[2] = q[head].nowpos[2];
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[0] = 0;
                    q[tail].nowpos[1] = q[head].nowpos[1] + q[head].nowpos[0];
                    q[tail].nowpos[2] = q[head].nowpos[2];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
    
                if(q[head].nowpos[0] > M - q[head].nowpos[2]){
                    q[tail].nowpos[0] = q[head].nowpos[0] - (M - q[head].nowpos[2]);
                    q[tail].nowpos[1] = q[head].nowpos[1];
                    q[tail].nowpos[2] = M;
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[0] = 0;
                    q[tail].nowpos[2] = q[head].nowpos[2] + q[head].nowpos[0];
                    q[tail].nowpos[1] = q[head].nowpos[1];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
            }
    
    
    
            if(q[head].nowpos[1] != 0){
                if(q[head].nowpos[1] > S - q[head].nowpos[0]){
                    q[tail].nowpos[0] = S;
                    q[tail].nowpos[1] = q[head].nowpos[1] - S + q[head].nowpos[0];
                    q[tail].nowpos[2] = q[head].nowpos[2];
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[1] = 0;
                    q[tail].nowpos[0] = q[head].nowpos[1] + q[head].nowpos[0];
                    q[tail].nowpos[2] = q[head].nowpos[2];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
    
                if(q[head].nowpos[1] > M - q[head].nowpos[2]){
                    q[tail].nowpos[1] = q[head].nowpos[1] - (M - q[head].nowpos[2]);
                    q[tail].nowpos[0] = q[head].nowpos[0];
                    q[tail].nowpos[2] = M;
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[1] = 0;
                    q[tail].nowpos[2] = q[head].nowpos[2] + q[head].nowpos[1];
                    q[tail].nowpos[0] = q[head].nowpos[0];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
            }
    
    	    if(q[head].nowpos[2] != 0){
                if(q[head].nowpos[2] > S - q[head].nowpos[0]){
                    q[tail].nowpos[0] = S;
                    q[tail].nowpos[2] = q[head].nowpos[2] - S + q[head].nowpos[0];
                    q[tail].nowpos[1] = q[head].nowpos[1];
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[2] = 0;
                    q[tail].nowpos[0] = q[head].nowpos[2] + q[head].nowpos[0];
                    q[tail].nowpos[1] = q[head].nowpos[1];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
    
                if(q[head].nowpos[2] > N - q[head].nowpos[1]){
                    q[tail].nowpos[2] = q[head].nowpos[2] - (N - q[head].nowpos[1]);
                    q[tail].nowpos[0] = q[head].nowpos[0];
                    q[tail].nowpos[1] = N;
                    q[tail].step = q[head].step + 1;
                }
                else{
                    q[tail].nowpos[2] = 0;
                    q[tail].nowpos[1] = q[head].nowpos[2] + q[head].nowpos[1];
                    q[tail].nowpos[0] = q[head].nowpos[0];
                    q[tail].step = q[head].step + 1;
                }
    
                if(!flag[q[tail].nowpos[1]][q[tail].nowpos[2]]){
                    flag[q[tail].nowpos[1]][q[tail].nowpos[2]] = true;
                    tail ++;
                }
            }
            head ++;
        }
        return -1;
    }
    
    
    
    int main(void){
        while(1){
            cin >> S >> N >> M;
            if(S == 0 && N == 0 && M == 0)
                break;
            if(S % 2){
                cout << "NO" << endl;
                continue;
            }
            
            goal = S / 2;
            memset(flag, 0, sizeof(flag));
            ans = bfs();
            if(ans == -1)
                cout << "NO" << endl;
            else 
                cout << ans << endl;
        }
        return 0;
    }


  • 相关阅读:
    wrap,wrapall,wrapinner的区别:
    jqueryappend和appendTo的区别
    《Nagios系统监控实践》一书出版
    基于Python的密码生成程序的优化
    Puppet学习:pp文件权限问题
    依然看不清
    免费编程中文书籍索引
    Linux批量修改指定目录下的文件或文件夹权限
    puppet学习:文件夹权限的问题
    Zabbix探索:Zabbix API使用时的错误1
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136089.html
Copyright © 2011-2022 走看看