题目链接

Problem Description

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

题意:

容量分别是N 毫升和M 毫升,可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。能平分的话请输出最少要倒的次数,否则输出"NO"。

分析:

广搜,每一个队头元素都要进行6次操作,如图进行了n->m一次操作:

对应的6中操作(S->N,S->M,N->S,N->M,M->S,M->N)

此图必须注意:n,m的意思为:瓶子n中此刻存在的可乐量为n,瓶子m中此刻存在的可乐量为m

注意:从一个瓶倒进另一个瓶时必须分两种情况,1:能装满2:不能装满

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std; struct node
{
int x[3];
int len;
}; queue<node>q; int map[101][101][101];//记录三个状态是否出现过 int dx[3];//三个容器分别最多可以装多少水
double isok; int bfs(int x,int y,int z,int xx)
{
memset(map,0,sizeof(map));
while(!q.empty())
{
q.pop();
}
node p;
p.x[0]=x;
p.x[1]=y;
p.x[2]=z;
p.len=0;
q.push(p);
while(!q.empty())
{
node p=q.front();
q.pop();
if((p.x[0]==p.x[1]&&p.x[1]==xx)||(p.x[0]==p.x[2]&&p.x[0]==xx)||(p.x[1]==p.x[2]&&p.x[1]==xx))
{
return p.len;
}
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(i==j)continue;
node p1;
if(p.x[i]<=dx[j]-p.x[j])//第j个杯子是否可以装下p.x[i]的水
{
p1.x[j]=p.x[j]+p.x[i];
p1.x[i]=0;
}
else//不能倒下p.x[i]的水。则倒一部分进去
{
p1.x[i]=p.x[i]-(dx[j]-p.x[j]);
p1.x[j]=dx[j];
}
for(int k=0; k<3; k++)
{
if(k!=i&&k!=j)
{
p1.x[k]=p.x[k];
}
}
p1.len=p.len;
if(map[p1.x[0]][p1.x[1]][p1.x[2]]==1)
continue;
map[p1.x[0]][p1.x[1]][p1.x[2]]=1;
p1.len++;
q.push(p1);
}
}
}
return -1;
} int main()
{
int s,n,m;
while(~scanf("%d%d%d",&s,&n,&m))
{
if(s==0&&n==0&&m==0)break;
if(s%2)//可乐总体积是奇数的话,肯定是不能够平分的
{
printf("NO\n");
}
else
{
dx[0]=s,dx[1]=n,dx[2]=m;
int re=bfs(s,0,0,s/2);
if(re==-1)
printf("NO\n");
else
printf("%d\n",re);
}
}
return 0;
}

hdu 1495 非常可乐 (广搜)的更多相关文章

  1. hdu 1495 非常可乐 广搜

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> ][][]; ...

  2. HDU ACM 1495 非常可乐(广搜BFS)

    非常可乐 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  3. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

  4. HDU 1495 非常可乐 (只是转了个弯的广搜题)

    N - 非常可乐 =========================================================================================== ...

  5. HDU 1495 非常可乐 BFS

    题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...

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

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

  7. HDU 1495 非常可乐

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103711#problem/M /*BFS简单题 链接地址: http://acm.hdu ...

  8. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

  9. HDU 1495 非常可乐 bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 第三个杯子的盛水量可由前两个杯子得到,而前两个杯子状态总数在100*100以内,穷举可实现 #includ ...

随机推荐

  1. (三)使用Jmeter模拟300个用户登录

    1.首先在系统中创建300个用户(在这里使用 pl/sql 进行循环创建): 代码如下: --先对原先的表进行备份 :CREATE TABLE sys_user_bak AS SELECT * FRO ...

  2. js中__proto__和prototype的区别和关系? 这样好理解多了

    原型的概念 真正理解什么是原型是学习原型理论的关键.很多人在此产生了混淆,没有真正理解,自然后续疑惑更多. 首先,我们明确原型是一个对象,其次,最重要的是, Every function has a ...

  3. springboot学习笔记-3 整合redis&mongodb

    一.整合redis 1.1 建立实体类 @Entity @Table(name="user") public class User implements Serializable ...

  4. 知乎回答:每日完成任务用于打卡的APP

    其实我也一直在寻找最佳的解决方案.安卓上有这样的,叫做HabitHub.用过一段时间,不容易坚持,这个软件对于培养习惯来说无疑是最好的,但是仅限于记录,这样的软件实在太多.我这里提供一下我自己的方法, ...

  5. Java IO流学习总结 - BIO

      Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据 ...

  6. [AT697]フィボナッチ

    题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$.$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i ...

  7. 51nod乘积之和

    题目链接 戳我 题意简述 你有长为\(n\)的序列和\(Q\)个询问,每次询问一个\(k\),求用\(k\)个数组成的不同方案的乘积的和. sol 显然要预处理一波. 考虑分治,左右两边都求出来后,怎 ...

  8. 20165218 《网络对抗技术》Exp0 Kali安装 Week1

    Kali Linux安装 下载 在Kali官网下载Kali Linux 64 Bit版本 打开VM,选择文件->新建虚拟机,一直点击下一步,注意这里选择稍后安装操作系统 版本中找不到Kali,可 ...

  9. 面向对象高级编程(2)-使用@property

    使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻 ...

  10. Android Studio导入ApiDemos

    安卓开发入门篇(一):Android Studio导入ApiDemoshttp://blog.csdn.net/dreamer2020/article/details/52316895 https:/ ...