HDU1495 非常可乐

来源:互联网 发布:保险库升级数据大全 编辑:程序博客网 时间:2024/05/17 06:14

                                                       非常可乐

时间限制:Java: 2000 ms / Others: 1000 ms内存限制: Java: 32768 KB / Others: 32768 KB

问题描述

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

输入说明

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

输出说明

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

输入样例

7 4 34 1 30 0 0

输出样例

NO3

来源

seeyou


解题思路:本题用广度优先搜索解答,就是3个容器,容量为S,N,M,其中S中装满可乐,要把可乐平分到2个容器,求最短路劲。
                    用标记数组flag[105][105][105]标记已出现过的状态,再次出现时不入队,剪枝。搜索时就把3个容器里的可乐倒来倒去就行了,一但遇到符合条件的,直接跳出搜索,输出答案即可。



#include<cstdio>#include<cstring>#include<queue>using namespace std;int flag[105][105][105];int s,n,m;double av;struct node{    int x;    int y;    int z;    int step;};void dao(int &x,int max_x,int &y,int max_y) //把x中得可乐倒到y中{    if(x==0||y==max_y)   //无法倒,不处理        return ;    y+=x;   //全部倒进去    x=0;    if(y>max_y) //y溢出    {        x=y-max_y;        y=max_y;    }}bool ok(int x,int y,int z){    int k=0;    if(x==av)    k++;    if(y==av)    k++;    if(z==av)    k++;    if(k==2)    return true;    return false;}int bfs(){    node first,next;    queue<node> q;    first.x=s;    first.y=0;    first.z=0;    first.step=0;    q.push(first);    flag[first.x][first.y][first.z]=1;    while(!q.empty())    {        //printf("first.x=%d  first.y=%d  first.z=%d  first.step\n",first.x,first.y,first.z,first.step);        first=q.front();        q.pop();        next.step=first.step+1;        //x->y        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.x,s,next.y,n);        if(ok(next.x,next.y,next.z)) //已经平分到2个容器            return next.step;        if(!flag[next.x][next.y][next.z]) //该情况为现过            flag[next.x][next.y][next.z]=1,q.push(next);        //x->z        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.x,s,next.z,m);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //y->x        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.y,n,next.x,s);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //y->z        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.y,n,next.z,m);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //z->x        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.z,m,next.x,s);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);        //z->y        next.x=first.x;        next.y=first.y;        next.z=first.z;        dao(next.z,m,next.y,n);        if(ok(next.x,next.y,next.z))            return next.step;        if(!flag[next.x][next.y][next.z])            flag[next.x][next.y][next.z]=1,q.push(next);    }    return -1;}int main(){    while(scanf("%d%d%d",&s,&n,&m)&&s)    {        memset(flag,0,sizeof(flag));        av=(double)s/2;        if(s%2!=0)            printf("NO\n");        else        {            int k=bfs();            if(k==-1)                printf("NO\n");            else                printf("%d\n",k);        }    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有人冒充微信头像和熟人借钱怎么办 微信红包输了50多万怎么办 脖子里的绳结接口磨脖子怎么办 母比格犬生了小狗毛色变了怎么办 母比格犬生了小狗毛色很差怎么办 貂皮大衣上的暗扣掉了怎么办 呢子夹克袖子长但又不想改短怎么办 黑色的衣服熨的有点发亮怎么办 宿管阿姨工作中与学生起冲突怎么办 中通快递发的衣服不合适怎么办 加盟母婴店如果不干了货怎么办 双十一搞活动买的东西退货怎么办 天猫预售30天不发货怎么办 天猫搞活动的商品总不发货怎么办 淘宝买的东西物流把货物损坏怎么办 苹果手机5s每部存满怎么办 天猫退货分开发货退的话怎么办 淘宝优惠券电脑端显示不出来怎么办 天猫退货退款寄错了怎么办 天猫已退款货又发过来了怎么办 小米商城预售订单点错退款了怎么办 淘宝发布宝贝类目价格受限制怎么办 2019天猫续签评分不达标怎么办 天猫店铺动态不达标不能续签怎么办 京东自提发现货有问题怎么办 京东试用成功商家不发货怎么办 在淘宝主页搜不到我的店铺名怎么办 淘宝发货单号填到别人那去了怎么办 买家申请淘宝介入后同意退款怎么办 淘宝卖家手机版购买装修模块怎么办 天猫店铺和淘宝店铺想要装修怎么办 支付宝转账银行卡卡号错误怎么办 淘宝图片空间照片全部删除了怎么办 我把淘宝图片空间照片删除了怎么办 淘宝发布宝贝怎么没知道品牌怎么办 淘宝提前确认收货了怎么办已经发货 苹果支付安全提示问题忘记了怎么办 没有在规定日期交首付款怎么办 淘宝申请退款又不想退了怎么办 淘宝申请退款后又不想退了怎么办 申请退款后如果不想退了怎么办