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;
    }
    


  • 相关阅读:
    Mybatis传入list的注意点
    synchronized锁
    手撸红黑树
    Vue cdn加速配置
    多线程之BlockingQueue中 take、offer、put、add的一些比较
    线程池
    ThreadLocal
    jdk LocalDateTime mybatis 空指针解决办法
    不同对象中 类型与属性名的属性 进行数据转换
    HashMap 的put方法
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3212004.html
Copyright © 2011-2022 走看看