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\n",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\n");

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)