题目描述
红红是个肥宅,所以他很爱喝肥宅快乐水。但是每次当红红买了肥宅快乐水后,左左都要求和红红一起分享这一瓶可乐,而且要和红红喝得一样多。但是红红手中只有两个杯子,他们的容量的分别是 N 毫升 和 M毫升,可乐的体积为 S 毫升(正好装满一升)。他们三个之间可以相互倒可乐,都是没有刻度的,而且 S == N+M,0 < S < 101 0 < N 0 < M。聪明的你们能告诉他们能平分吗,如果能请输出倒可乐的最少次数,如果不能输出”NO“。

输入
三个整数: S 可乐的体积, N 和 M 是两个杯子的容量,以 ”0 0 0”结束。
输出
如果能输出倒可乐的最少次数,如果不能输出“NO”。
样例输入
7 4 3
4 1 3
0 0 0
样例输出
NO
3

每步都有注释,可自行理解。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 105;
bool v[4];
bool vis[maxn][maxn][maxn];struct Node//表示每次倒水后的步数,step是记录倒水后的步数
{int v[4];//可以用来标记每一个状态的水位情况 int step;//步数
} temp;void pour(int a, int b)  //倒水函数,把a杯子中的可乐倒到b杯子//表示每次倒水后的状态。
{int sum = temp.v[a] + temp.v[b];//可乐总量是sum,并且sum=a+b; if (sum >= v[b])//如果总数大于sum>b; temp.v[b] = v[b];//就将 b装满。 elsetemp.v[b] = sum;//如果总数sum小于b的容量就将所有的可乐全部放入b中。 temp.v[a] = sum - temp.v[b];//剩下a中的可乐就是sum-b中的。
}void BFS()
{queue<Node>q;//申请一队列 Node now;//表示现在的水量 now.v[0] = v[0];//结构体数组的初始化 总的水量 now.v[1] = 0;//结构体数字的初始化 第一个杯子水量为零 now.v[2] = 0;//结构体数组的初始化  第二个杯子的水量为零 now.step = 0;//将初始的步数设置为零 q.push(now);//将现在的状态水量入队 memset(vis, 0, sizeof(vis));//将数组初始化为0; vis[v[0]][0][0] = true;//将vis数组标记为1; while (!q.empty())//如果队列不为空,执行以下的操作。 {now = q.front();//取队列头元素 ,也就是说当前的每个杯子的水量就是队头的元素 q.pop();//取出后,就将队列的第一个元素出队 if (now.v[0] == now.v[2] && now.v[1] == 0)//如果第一个杯子的水等于第二个杯子的水就输出步数。 {cout << now.step << endl;      //步骤输出return;//输出后就直接return 出函数即可。 }for (int i = 0; i < 3; i++)//查看每一种的情况 {for (int j = 0; j < 3; j++){if (i != j)//自己不倒水给自己{temp = now;//每个水位情况都要把所有操作枚举一遍,//所以都要赋值为原始水位情况pour(i, j);//每经过一个过程就将执行一次倒水函数。 if (!vis[temp.v[0]][temp.v[1]][temp.v[2]])//如果本次状态没有经历过,也就是说本次状态的数组值为零。 {temp.step++;//记录每次倒水后步数加一 q.push(temp);//将当前的状态入队 vis[temp.v[0]][temp.v[1]][temp.v[2]] = true;//并且将此次状态标记为1; }}}}}cout << "NO" << endl;// 不能平分输出NO。
}
int main()
{while (scanf("%d%d%d", &v[0], &v[1], &v[2]) != EOF){if (v[0] + v[1] + v[2] == 0)//如果都没有水直接结束。//排除有负数的情况。 break;if (v[1] > v[2])       //保证v1小于v2也就是杯子a<b杯子 swap(v[1], v[2]);否则交换两个杯子 BFS();//执行广度搜索BFS }return 0;
}

非常可乐(三个杯子倒水问题)相关推荐

  1. 三个容器倒水_绿茶“最忌讳”先放茶叶再倒水,想要茶味香浓,记住正确泡茶法...

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到内容了.每天都有分享.完全是免费订阅,请放心关注懂茶的人都知道,绿茶对于水温是有要求的.但是很多茶友在 ...

  2. 杯子倒水问题 -python

    题目:假设有两个杯子A ,B,用户只需要输入两个杯子的容量值和需要获取的杯子数值left_c.问两个杯子通过何种操作能获取到left_c 的数值. 分析:此题目是求解优化的问题.采用bfs算法. cl ...

  3. 【HDU1495非常可乐】【POJ3414Pots】

    HDU1495非常可乐 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和se ...

  4. L - 非常可乐——HDU-1495(bfs->优化bfs->数论)

    文章目录 非常可乐 第一种解题方案(最麻烦但最通俗易懂的): 第二种解题方案(优化bfs,减少不必要的计算) 推理: 优化: 第三种解题方案(数论) 非常可乐 原题链接:http://acm.hdu. ...

  5. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 杯子 + Kronican

    杯子 Kronican [题目描述] 重庆八中在80周年校庆的时候获捐n个杯子, 每个杯子有两个属性:一个是已装水量 ai,一个是可装水量 bi(ai <= bi). 从一个杯子向另一个杯子倒 ...

  7. HDU - 1495 - 非常可乐

    先上题目: 非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. hdu 1495非常可乐 BFS

    文章目录 AC代码 TLE ???为啥啊?不知道哪里不对,导致超时 对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = ... AC代 ...

  9. NYoj21 三个水杯

    三个水杯 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没 ...

最新文章

  1. 智能车大赛AI视觉组培训第一弹——基础篇
  2. 转:fopen与open可以转换吗
  3. Linux GPIO
  4. 扎克伯格靠AI挺过危机,Facebook满血复活还需3年
  5. OpenCV总结:实现马赛克和毛玻璃滤镜效果
  6. Android实战练习——简单的网络视频播放器
  7. GGally与pairs相关关系图_史上最全(一)
  8. 研发团队建设几点看法及建议
  9. 脉冲雷达信号处理流程
  10. 非度量多维排列 NMDS (Non-metric multidimensional scaling)分析
  11. matlab计算aqi代码,AQI计算第一课,爬取全部城市AQI数据的代码一样但是只能爬出第一个城市的数据是怎么回事?...
  12. Unity3D内置Shader私房课(三)Decal贴花
  13. 有关魅族手机遇到TextView显示异常
  14. python3获取网页天气预报信息并打印
  15. 【太虚AR_v0.1】使用教程 | 图像识别(多目标)
  16. 最新车载以太网解决方案
  17. 经纬度定义、经纬度格式、GDAL中地理坐标转换及地理坐标屏幕显示
  18. HTML开心餐厅网页制作,开心餐厅技巧经验总结
  19. 技术升级 | 戴着口罩也能识别人脸啦
  20. 量化投资学习——ESG因子收益分析

热门文章

  1. 突发!美国股市大跌,好戏才刚刚开始!(深度)
  2. 小学了解计算机网络微课设计,基于微课的计算机网络课程教学设计研究
  3. flutter Gradle build failed to produce an .apk file. xxx\build,but the tool couldn‘t find it.
  4. 《Python编程:从入门到实践》读书笔记:第6章 字典
  5. C#操作Excel表格,不积硅步无以至千里
  6. MAN 手册各章节功能介绍及快捷键键位整理
  7. 精美好用的思维导图插件,无缝对接各种前端框架,快来围观吧
  8. 10个不得不买的高科技智能机器人
  9. P4V文件被独占checkout后的解锁操作
  10. U盘插入电脑提示格式化