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

    题目链接:hdu1495

    共有6种操作,x-->y,x-->z,y-->x,y-->z,z-->x,z-->y

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #define MAXN 105
    using namespace std;
    int v[MAXN][MAXN][MAXN];
    int a,b,c,flag;
    struct node
    {
        int x,y,z;
        int step;
    };
    bool judge(node k)
    {
        if( (k.x == k.y && k.z == 0) || (k.x == k.z && k.y == 0) || (k.z == k.y && k.x == 0) )
        return 1;
    
        return 0;
    }
    void bfs()
    {
        queue <node> q;
        node s,temp;
        s.x = a;
        s.y = 0;
        s.z = 0;
        s.step = 0;
        v[s.x][s.y][s.z] = 1;//标记该状态已存在过
        q.push(s);
        while(!q.empty())
        {
            temp = q.front();
            q.pop();
            int num;
            if(judge(temp))
            {
                printf("%d
    ",temp.step);
                flag = 1;
                return ;
            }
            if(temp.x > 0)
            {
                if(temp.y < b)//x-->y
                {
                    num = b - temp.y;//表示b中还差多少装满
                    s.z = temp.z;
                    s.step = temp.step + 1;
                    if(temp.x > num)
                    {
                        s.x = temp.x - num;
                        s.y = b;
                    }
                    else
                    {
                        s.x = 0;
                        s.y = temp.x + temp.y;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
                if(temp.z < c)//x-->z
                {
                    num = c - temp.z;
                    s.y = temp.y;
                    s.step = temp.step + 1;
                    if(temp.x > num)
                    {
                        s.x = temp.x - num;
                        s.z = c;
                    }
                    else
                    {
                        s.x = 0;
                        s.z = temp.x + temp.z;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
            }
            if(temp.y > 0)
            {
                if(temp.x < a)//y-->x
                {
                    num = a - temp.x;
                    s.z = temp.z;
                    s.step = temp.step + 1;
                    if(temp.y > num)
                    {
                        s.y = temp.y - num;
                        s.x = a;
                    }
                    else
                    {
                        s.y = 0;
                        s.x = temp.y + temp.x;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
                if(temp.z < c)//y-->z
                {
                    num = c - temp.z;
                    s.x = temp.x;
                    s.step = temp.step + 1;
                    if(temp.y > num)
                    {
                        s.y = temp.y - num;
                        s.z = c;
                    }
                    else
                    {
                        s.y = 0;
                        s.z = temp.y + temp.z;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
            }
            if(temp.z > 0)
            {
                if(temp.x < a)//z-->x
                {
                    num = a - temp.x;
                    s.y = temp.y;
                    s.step = temp.step + 1;
                    if(temp.z > num)
                    {
                        s.z = temp.z - num;
                        s.x = a;
                    }
                    else
                    {
                        s.z = 0;
                        s.x = temp.x + temp.z;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
                if(temp.y < b)//z-->y
                {
                    num = b - temp.y;
                    s.x = temp.x;
                    s.step = temp.step + 1;
                    if(temp.z > num)
                    {
                        s.z = temp.z - num;
                        s.y = b;
                    }
                    else
                    {
                        s.z = 0;
                        s.y = temp.y + temp.z;
                    }
                    if(!v[s.x][s.y][s.z])
                    {
                        v[s.x][s.y][s.z] = 1;
                        q.push(s);
                    }
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d%d",&a,&b,&c) && (a + b + c))
        {
            memset(v,0,sizeof(v));
            flag = 0;
            bfs();
            if(!flag) printf("NO
    ");
        }
        return 0;
    }
    


  • 相关阅读:
    iOS 6 Auto Layout NSLayoutConstraint 界面布局
    TexturePacker使用心得---1。
    今天说说敏捷个人-认识自我,管理自我 v0.2
    iPhone 5 屏幕尺寸变长指南
    JSON数据解析错误处理办法!
    IOS 入门介绍3iOS里面Frameworks介绍(续)
    Open GLSL ——01
    Open GLES 01
    IOS 入门介绍2iOS里面Frameworks介绍
    Opne GL ES 学习心得!
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3212004.html
Copyright © 2011-2022 走看看