hdu 1495 非常可乐(bfs)

来源:互联网 发布:苏州seo外包 编辑:程序博客网 时间:2024/05/20 19:48

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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

6种情况,一道写起来有点麻烦的水题。

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;int n,m ,k;struct node{    int x,y,z,step;    bool operator <(const node &rhs) const    {        return step>rhs.step;    }};int vis[110][110][110];priority_queue<node> que;int flag;int bfs(){    while(!que.empty())    {        node head = que.top();        que.pop();        for(int i=1;i<=6;i++)        {            int xx=head.x;            int yy=head.y;            int zz=head.z;            int ss=head.step;            // printf("%d %d %d %d\n",xx,yy,zz,ss );            int a,b,c;            if(i==1)            {                if(xx>m-yy)                {                     a=xx-(m-yy);                     b=m;                     c=zz;                }                else                {                     a=0;                     b=xx+yy;                     c=zz;                }            }            if(i==2)            {                if(xx>k-zz)                {                     a=xx-(k-zz);                     b=yy;                     c=k;                }                else                {                     a=0;                     b=yy;                     c=zz+xx;                }            }            if(i==3)            {                if(yy>n-xx)                {                     a=n;                     b=yy-(n-xx);                     c=zz;                }                else                {                     a=xx+yy;                     b=0;                     c=zz;                }            }            if(i==4)            {                if(yy>k-zz)                {                     a=xx;                     b=yy-(k-zz);                     c=k;                }                else                {                     a=xx;                     b=0;                     c=yy+zz;                }            }            if(i==5)            {                if(zz>n-xx)                {                     a=n;                     b=yy;                     c=zz-(n-xx);                }                else                {                    a=xx+zz;                    b=yy;                    c=0;                }            }            if(i==6)            {                if(zz>m-yy)                {                    a=xx;                    b=m;                    c=zz-(m-yy);                }                else                {                    a=xx;                    b=yy+zz;                    c=0;                }            }            if(!vis[a][b][c])            que.push(node{a,b,c,ss+1});            vis[a][b][c]=1;            if((a==b&&c==0)||(a==c&&b==0)||(b==c&&a==0))            {                flag=1;                return ss+1;            }        }    }    return 0;}int main(){    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        while(!que.empty()) que.pop();        if(n==0&&m==0&&k==0) break;        flag=0;        memset(vis,0,sizeof(vis));        que.push((node){n,0,0,0});        vis[n][0][0]=1;        int a=bfs();        if(a==0) printf("NO\n");        else            printf("%d\n", a);    }}
0 0
原创粉丝点击