搜索—Problem_1017-非常可乐

来源:互联网 发布:业主名录采集软件 编辑:程序博客网 时间:2024/04/30 15:40
                搜索—Problem_1017-非常可乐

题意
平分可乐问题,一瓶可乐,两个杯子,三者之间可以相互倒,求使两个杯子中可乐体积相同时的最少次数。
解题思路
采用BFS,预处理m < n < s,以后处理方便点,初始状态,m,n杯中可乐体积为0,s杯中体积为s;然后分六种情况:1, s 倒 m;2, s 倒 n;3, m 倒 n;4, m 倒 s;
5, n 倒 m;6, n 倒 s。直到n,s杯中的可乐能等分(此时m杯中体积为0)为止,若不能等分,则输出 NO。
感想
课上讲过的例题,复习一下,但还是很复杂,搜索···心好累
AC代码

#include<iostream>#include<cstring>#include<algorithm>#include<queue>using namespace std;#define maxn 101bool visited[maxn][maxn];int m,n,s,si,sj;struct node{    int x,y,all,t;  //x,y,all分别表示m,n,s杯中可乐的体积,t表示倒了多少次};void BFS(){    queue<node> que;    memset(visited,false,sizeof(visited));    node p,q;    p.x = 0,p.y = 0,p.t = 0,p.all = s;    que.push(p);    visited[p.x][p.y] = true;    while(!que.empty())    {        p = que.front();        que.pop();        if(p.y == p.all && p.y == s/2)                     {            cout<<p.t<<endl;            return;        }        if(p.all+p.x>m)    //s倒m        {            q.x = m,q.y= p.y,q.all =p.all+p.x-m,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        else        {            q.x = p.all+p.x,q.y = p.y,q.all = 0,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        if(p.all+p.y>n)          //s倒n        {            q.x= p.x, q.y = n, q.all = p.all+p.y-n,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        else        {            q.x = p.x,q.y = p.all+p.y,q.all = 0,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        if(p.x+p.y>n)    //m倒n        {            q.x = p.x+p.y-n,q.y = n,q.all = p.all,q.t = p.t+1;             if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        else        {            q.x = 0,q.y = p.x+p.y,q.all = p.all,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        q.all =p.all+p.x,q.x = 0,q.y = p.y,q.t = p.t+1; //m倒s        if(!visited[q.x][q.y])            que.push(q),visited[q.x][q.y] = true;          if(p.x+p.y > m)        {        q.y=p.y+p.x-m,q.x=m,q.all=p.all,q.t = p.t+1;//n倒m            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        else        {            q.x = p.x+p.y,q.y = 0,q.all = p.all,q.t = p.t+1;            if(!visited[q.x][q.y])                que.push(q),visited[q.x][q.y] = true;        }        q.all = p.all+p.y,q.x = p.x,q.y = 0,q.t = p.t+1; //n倒s        if(!visited[q.x][q.y])            que.push(q),visited[q.x][q.y] = true;    }    cout<<"NO"<<endl;}int main(){    while( (cin>>s>>m>>n) && (s||m||n) )    {        if(s%2)        {            cout<<"NO"<<endl;            continue;        }        if(m > n) swap(m,n);        BFS();    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 群超时无法撤回怎么办 被加州大学撤回录取怎么办 ppt转码失败怎么办 苹果xicloud满了怎么办 小米note3不充电怎么办 网易云海外会员怎么办 百度云支付失败怎么办 信用卡输入密码错误怎么办 相机储存卡被锁怎么办 sd卡检测不到怎么办 手机图标闪退怎么办 电视看爱奇艺版权受限怎么办 王者荣耀重复id怎么办 拼多多资源位下架怎么办 百度云网络异常怎么办 公开课没上好怎么办 ios云备份失败怎么办 网易云登录异常怎么办? 阴阳师网易账号冻结怎么办 梦幻账号被冻结怎么办 手机忘记解锁密码怎么办 胃疼持续一天怎么办 胃痛一天一夜怎么办 孩子爱玩电脑怎么办 ipad不显示画面怎么办 正版win10换电脑怎么办 电脑系统不是正版怎么办 苹果平板进水了怎么办 华为平板进水了怎么办 三星平板进水了怎么办 笔记本cpu运行过高怎么办 微博永久性封号怎么办 电脑占用内存多怎么办 直播签约后悔了怎么办 移动宽带网络不稳定怎么办 股票帐号被锁定怎么办 电脑帐号锁定了怎么办 云校家帐号被锁定怎么办 qq音乐停止运行怎么办 做事效率低怎么办教案 孩子做事效率低怎么办