HDU.1495 非常可乐 (BFS)
题意分析
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S< 101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出”NO”。
BFS时有6种操作,分别是S->M,S->N,N->S,N->M,M->S,M->N。每次讲这6中情况放入队列,遇到结果输出即可。
若被分的可乐为奇数,那么无法平分,因为给出的可乐都是整数。
代码总览
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define nmax 105
#define inf 1000000
using namespace std;
bool visit[nmax][nmax][nmax];
typedef struct{
int n;
int m;
int s;
int times;
// int type;
}mes;
int N,M,S,ans,Target;
void bfs()
{
queue<mes> q;
while(!q.empty()) q.pop();
mes temp = {0,0,S,0},head;
temp.n = temp.m = temp.times = 0;
temp.s = S;
memset(visit,0,sizeof(visit));
visit[temp.n][temp.m][temp.s] = true;
q.push(temp);
while(!q.empty()){
head = q.front();q.pop();
if((head.m == Target && head.n == Target) || (head.m == Target && head.s == Target) || (head.n == Target && head.s == Target)){
ans = head.times;
return;
}
for(int i = 0;i<6;++i){
temp = head;
if(i == 0){// S->N
if(head.s + head.n < N){
temp.n = head.s + head.n;
temp.s = 0;
}else{
temp.n = N;
temp.s = head.s + head.n - N;
}
}else if(i == 1){// S->M
if(head.s + head.m < M){
temp.m = head.s + head.m;
temp.s = 0;
}else{
temp.m = M;
temp.s = head.s + head.m - M;
}
}else if(i == 2){// N->S
if(head.s + head.n < S){
temp.n = 0;
temp.s = head.s + head.n;
}else{
temp.n = head.s + head.n - S;
temp.s = S;
}
}else if( i == 3){// M->S
if(head.s + head.m < S){
temp.m = 0;
temp.s = head.s + head.m;
}else{
temp.m = head.s + head.m - S;
temp.s = S;
}
}else if(i == 4){// N->M
if(head.m + head.n < M){
temp.n = 0;
temp.m = head.m + head.n;
}else{
temp.m = M;
temp.n = head.m + head.n - M;
}
}else if(i == 5){// M->N
if(head.m + head.n < N){
temp.n = head.m + head.n;
temp.m = 0;
}else{
temp.n = N;
temp.m = head.m + head.n - N;
}
}
if(!visit[temp.n][temp.m][temp.s]){
visit[temp.n][temp.m][temp.s] = true;
// temp.type = i;
temp.times = head.times +1;
//printf("%d %d %d %d %d\n",temp.n,temp.m,temp.s,temp.times,temp.type);
q.push(temp);
}
}
}
}
int main()
{
// freopen("out.txt","w",stdout);
while(scanf("%d %d %d",&S,&N,&M) != EOF){
if(N == 0 && M == 0 && S == 0) break;
if(S%2 !=0){
printf("NO\n");
continue;
}
// printf("N M S TIME\n");
// printf("%d %d %d\n",N,M,S);
ans = inf;
Target = S/2;
bfs();
if(ans == inf) printf("NO\n");
else printf("%d\n",ans);
}
return 0;
}
HDU.1495 非常可乐 (BFS)的更多相关文章
- HDU 1495 非常可乐 BFS 搜索
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...
- HDU 1495 非常可乐 bfs 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=1495 第三个杯子的盛水量可由前两个杯子得到,而前两个杯子状态总数在100*100以内,穷举可实现 #includ ...
- (step4.2.5)hdu 1495(非常可乐——BFS)
题目大意:输入三个整数 a,b,c. a : 可乐瓶的容量,b: 甲杯的容量 ,c: 乙杯的容量.问能否用这三个被来实现饮料的平分???如果可以输出倒饮料的次数, 否则输出NO 解题思路:BFS ...
- HDU 1495 非常可乐 BFS搜索
题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...
- HDU 1495 非常可乐 BFS
题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...
- HDU - 1495 非常可乐 bfs互倒三杯水
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- BFS(倒水问题) HDU 1495 非常可乐
题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 非常可乐---hdu 1495(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意: 有3个杯子a b c:a=b+c:然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相 ...
- HDU 1495 非常可乐(BFS倒水问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...
随机推荐
- python Matplotlib数据可视化神器安装与基本应用
Matplotlib Matplotlib 是一个非常强大的 Python 画图工具; 手中有很多数据, Matplotlib能帮你画出美丽的: 线图; 散点图; 等高线图; 条形图; 柱状图; 3D ...
- RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ
在上一篇随笔中我们认识并安装了RabbitMQ,接下来我们来看下怎么在Spring Boot 应用中整合RabbitMQ. 先给出最终目录结构: 搭建步骤如下: 新建maven工程amqp 修改pom ...
- JavaScript学习笔记(一)——JS速览
第一章 JS速览 1 限制时间处理事件 <script> setTomeout(wakeUpUser,5000); function wakeUpUser() { alert(" ...
- 238. [LeetCode] Product of Array Except Self
Given an array nums of n integers where n > 1, return an array output such that output[i] is equ ...
- tensorflow中使用mnist数据集训练全连接神经网络-学习笔记
tensorflow中使用mnist数据集训练全连接神经网络 ——学习曹健老师“人工智能实践:tensorflow笔记”的学习笔记, 感谢曹老师 前期准备:mnist数据集下载,并存入data目录: ...
- git blame 查看某行代码提交记录
1. 在当前git项目目录下执行 git blame -L 38,38 <filename> 例子: git blame -L 38,38 src/component/BarCode/i ...
- 手机上Uncaught ReferenceError: __WEBPACK_AMD_DEFINE_ARRAY__ is not defined的错误
问题: vue2.0和webpack2.X的写的项目在电脑的浏览器上打开正常,在手机浏览器中访问页面的时候不能正常显示,空白. 通过chrome的真机调试chrome://inspect/#devic ...
- PHP中的闭包详解
PHP闭包(Closure)使用详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-02我要评论 本篇文章介绍了,PHP闭包(Closure)的使用介绍,需要的朋友参考下 不知不 ...
- 团队目标WBS及具体任务分工
• 首先我们讨论了实验第一个冲刺周期要实现的功能,我们的初期目标. • 然后我们进一步梳理了第一阶段的任务和需求. • 之后对任务进行了划分和领取. • 最后每个人对自己的任务进行了估算,并约定 ...
- 关于cnblog.com的用户体验
首先我自己目前是一个学生党,每天在博客园上就上发布一些自己做的东西以及老师布置的作业,还能在上面学习很多别人的一些好的列子,我就希望博客园能够很好地为我们这些学生服务,当我们用它时能够很好地达到我们的 ...