非常可乐

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11034    Accepted Submission(s): 4458

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
 
Author
seeyou
 
题解:奇数的除外,总共六种倒法,a->b a->c b->a b->c c->a c->b.三种状态,仔细一点模拟就可以做出来了。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <stdlib.h>
using namespace std; struct Node{
int x,y,z,step;
};
int a,b,c;
bool vis[][][];
int bfs(){
memset(vis,false,sizeof(vis));
queue<Node> q;
Node s;
s.x = a,s.y = ,s.z = ,s.step = ;
vis[a][][]=true;
q.push(s);
while(!q.empty()){
Node now = q.front();
q.pop();
if(now.x==a/&&now.y==a/||now.x==a/&&now.z==a/||now.y==a/&&now.z==a/){
return now.step;
}
Node next;
if(now.x!=){ /// a -> b
if(now.x>b-now.y){ ///还可以倒满b
next.x =now.x-(b-now.y);
next.y = b;
next.z = now.z;
}else{
next.x = ;
next.y =now.x+now.y;
next.z = now.z;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
if(now.x!=){ ///a->c
if(now.x>c-now.z){
next.x = now.x - (c-now.z);
next.y = now.y;
next.z = c;
}else{
next.x = ;
next.y = now.y;
next.z =now.z+now.x;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
if(now.y!=){ ///b->a
if(now.y>a-now.x){
next.x = a;
next.y = now.y - (a-now.x);
next.z = now.z;
}else{
next.x = now.x+now.y;
next.y = ;
next.z =now.z;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
if(now.y!=){ ///b->c
if(now.y>c-now.z){
next.x = now.x;
next.y = now.y - (c-now.z);
next.z = c;
}else{
next.x = now.x;
next.y = ;
next.z =now.z+now.y;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
if(now.z!=){ ///c->a
if(now.z>a-now.x){
next.x = a;
next.y = now.y;
next.z = now.z - (a-now.x);
}else{
next.x = now.x+now.z;
next.y = now.y;
next.z = ;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
if(now.z!=){ ///c->b
if(now.z>b-now.y){
next.x = now.x;
next.y = b;
next.z = now.z - (b-now.y);
}else{
next.x = now.x;
next.y = now.y+now.z;
next.z = ;
}
next.step=now.step+;
if(!vis[next.x][next.y][next.z]){
vis[next.x][next.y][next.z] = true;
q.push(next);
}
}
}
return -;
}
int main(){
while(scanf("%d%d%d",&a,&b,&c)!=EOF,a+b+c){
if(a%==){
printf("NO\n");
continue;
}
int ans = bfs();
if(ans==-){
printf("NO\n");
}else{
printf("%d\n",ans);
}
}
}

hdu 1495(BFS)的更多相关文章

  1. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  2. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

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

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

  4. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  5. HDU 1495 非常可乐 BFS 搜索

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

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

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

  7. 非常可乐---hdu 1495(BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意: 有3个杯子a b c:a=b+c:然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...

  9. HDU - 1495 非常可乐 【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路 首先 如果可乐的体积 是奇数 那么是无解的 然后 如果能够得到两杯 都是一般容量的可乐 那 ...

随机推荐

  1. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

    肝了两题... T1一眼题,分解质因数,找出2的个数和5的个数取min输出 #include<iostream> #include<cstring> #include<c ...

  2. windows内存映射文件

    http://shushanyegui.duapp.com/?p=731 在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序 #include "stdafx.h&q ...

  3. JavaScript滚动条的制作

    效果演示   这个效果的制作是借助setTimeout的第三个参数.setTimeout/setInterval,这两个函数相信前端开发同学都很熟悉.它们在非IE(6-9)浏览器中还可以如下使用: v ...

  4. 后端日期类属性date 不接受string类型日期,都是没找到解决的方法,所有前端传回的string字符串都一一转化为java定义的类型

    1.比如日期 我们可以是yyyy-MM-dd 亦可以是 yyyy-MM-dd HH:mm:ss 方法1在java代码中需要的字段上加上注解 写上日期类型,不过这样很麻烦,每个人写了日期类型的接收前端的 ...

  5. linux 常见服务端口

    Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons) 来执行的.守护进 ...

  6. STL之七:STL各种容器的使用时机详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8550235 C++标准程序库提供了各具特长的不同容器.现在的问题是:该如何选择最佳的 ...

  7. HDU4305:Lightning(生成树计数+判断点是否在线段上)

    Lightning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. Android提示框与通知的使用

    1.通知 Android 3.0以前使用的方法 NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION ...

  9. 51Nod 1003 阶乘后面0的数量 | 思维

    题意:n的阶乘后面0的个数,如果直接算出阶乘再数0的数量一定会超时的. 因为10=2*5,所以求出5贡献的次数就行. #include "bits/stdc++.h" using ...

  10. LightOJ 1093 - Ghajini 线段树

    http://www.lightoj.com/volume_showproblem.php?problem=1093 题意:给定序列,问长度为d的区间最大值和最小值得差最大是多少. 思路:可以使用线段 ...