非常可乐

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. js判断设备类型

    1. 判断微信 function is_weixin() { var ua = window.navigator.userAgent.toLowerCase(); if (ua.match(/Micr ...

  2. bzoj4773: 负环(倍增floyd)

    浴谷夏令营例题...讲师讲的很清楚,没看题解代码就自己敲出来了 f[l][i][j]表示i到j走2^l条边的最短距离,显然有f[l][i][j]=min(f[l][i][j],f[l-1][i][k] ...

  3. [学习笔记]2-SAT 问题

    (本文语言不通,细节省略较多,不适合初学者学习) 解决一类简单的sat问题. 每个变量有0/1两种取值,m个限制条件都可以转化成形如:若x为0/1则y为0/1等等(x可以等于y) 具体: 每个变量拆成 ...

  4. 非代码抽取的dex加固脱壳

    常见的非代码抽取的dex加固,可以通过修改或者hook源码中的dex解析函数拿到目标dex完成脱壳.该dex解析函数为DexFile* dexFileParse(const u1* data, siz ...

  5. ACE_DEBUG介绍及日志输出

    转载于:http://blog.csdn.net/zzjxiaozi/article/details/6642925 ACE_DEBUG  常规的一些输出消息   ACE_ERROR  会提供程序出错 ...

  6. A星寻路算法-Mind&Hand(C++)

    //注1:Mind & Hand,MIT校训,这里指的理解与实现(动脑也动手) //注2:博文分为两部分:(1)理解部分,为参考其他优秀博文的摘要梳理:(2)代码部分,是C++代码实现的,源码 ...

  7. ZooKeeper开发者指南(五)

    引言 这个文档是为了想利用ZooKeeper的协调服务来创建分布式应用的开发者提供的指南.它包括概念和实践的信息. 这个文档的一开始的的四部分呈现了不同ZooKeeper高级概念的的讨论.理解Zook ...

  8. 多条select语句的合并

    select (') , (') , (select max(ssq) from DW_MARK_FXJS.F_GS_YCXJJDCSY@new_zgxt ) from dual 这样就不用傻傻的执行 ...

  9. 2015/9/17 Python基础(13):函数

    函数是对程序逻辑进行结构化或过程化的一种编程方法. Python的函数返回值当什么也不返回时,返回了None和大多数语言一样,Python返回一个值或对象.只是在返回容器对象时,看起来像返回多个对象. ...

  10. 设置zookeeper开机自启动

    1.进入到/etc/init.d目录下,新建一个zookeeper脚本 cd /etc/init.d vi zookeeper #!/bin/bash #chkconfig:2345 20 90 #d ...