非常可乐

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

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
 
思路:水杯A向水杯B到水的经典公式。 mn=min(B-now.b,now.a),na=now.a-mn,nb=now.b+mn.
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN=;
struct Node{
int s,n,m;
int step;
Node(){}
Node(int cs,int cn,int cm,int cstep)
{
s=cs;
n=cn;
m=cm;
step=cstep;
}
};
int vis[MAXN][MAXN][MAXN];
int S,N,M;
void bfs()
{
queue<Node> que;
que.push(Node(S,,,));
vis[S][N][M]=;
while(!que.empty())
{
Node now=que.front();que.pop();
if((now.s==&&now.n==now.m)||(now.n==&&now.s==now.m)||(now.m==&&now.s==now.n))
{
printf("%d\n",now.step);
return ;
}
int nes,nen,nem,mn;
mn=min(N-now.n,now.s);
nes=now.s-mn;
nen=now.n+mn;
nem=now.m;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
} mn=min(M-now.m,now.s);
nes=now.s-mn;
nen=now.n;
nem=now.m+mn;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
} mn=min(S-now.s,now.n);
nes=now.s+mn;
nen=now.n-mn;
nem=now.m;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
} mn=min(M-now.m,now.n);
nes=now.s;
nen=now.n-mn;
nem=now.m+mn;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
} mn=min(S-now.s,now.m);
nes=now.s+mn;
nen=now.n;
nem=now.m-mn;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
} mn=min(N-now.n,now.m);
nes=now.s;
nen=now.n+mn;
nem=now.m-mn;
if(!vis[nes][nen][nem])
{
vis[nes][nen][nem]=;
que.push(Node(nes,nen,nem,now.step+));
}
}
printf("NO\n");
}
int main()
{
while(scanf("%d%d%d",&S,&N,&M)!=EOF&&S&&N&&M)
{
memset(vis,,sizeof(vis));
if(S%!=)
{
printf("NO\n");
}
else bfs();
}
return ;
}
 

HDOJ1495(倒水BFS)的更多相关文章

  1. hdu1495 倒水bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1495/ 题意:给定三个杯子S,M,N,满足S=M+N,现在要求用最短的次数将S杯中的饮倒平分到两个杯子中.我们首 ...

  2. poj3414Pots(倒水BFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13231   Accepted: 5553   Special J ...

  3. hdoj1495简单BFS

    #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...

  4. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  5. codevs1226倒水问题(Bfs)

    /* 首先建立模型 可以看成是三个水杯 第三个无穷大 (这里看成是201足够了) 最少步数 想到Bfs 维护队列里的状态:要有个步数 还要有v :此时刻三个杯子有多少水 然后倒水:因为没有刻度 所以有 ...

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

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

  7. HDU 1495 非常可乐【BFS/倒水问题】

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

  8. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  9. POJ - 3414 Pots BFS(著名倒水问题升级版)

    Pots You are given two pots, having the volume of A and B liters respectively. The following operati ...

随机推荐

  1. LengthFieldBasedFrameDecoder 秒懂

    目录 写在前面 1.1.1. 解码器:FrameDecoder 1.1.1. 难点:自定义长度帧解码器 写在最后 疯狂创客圈 亿级流量 高并发IM 学习实战 疯狂创客圈 Java 分布式聊天室[ 亿级 ...

  2. DNN 数据的表示

  3. shell脚本调试运行

    1.在命令行提供参数:$sh -x script.sh   但是有的shell脚本只能用 ./xxx.sh的方式运行,不能用sh命令解析执行.则此方法会报错.2.脚本开头提供参数:#!/bin/sh ...

  4. linux c编程:进程环境

    一 进程终止: ⼀个进程可以登记若⼲个(具体⾃⼰验证⼀下)个函数,这些函数由exit⾃动调⽤,这些函数被称为终⽌处理函数, atexit函数可以登记这些函数. exit调⽤终⽌处理函数的顺序和atex ...

  5. 爬虫-【selenium—Webdriver元素定位的八种常用方式

    在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下 ...

  6. Git——基本思想和工作原理(二)

    核心知识点: 1.Git关注文件数据的整体是否发生变化,对更新的文件做一个快照,然后保存一个指向快照的索引,而不会关注文件数据的具体变化. 2.Git版本的更新几乎都发生在本地,不会因为没有网络而不能 ...

  7. LeetCode:字母异位词分组【16】

    LeetCode:字母异位词分组[16] 题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", &quo ...

  8. Javascript中闭包的个人理解

       Javascript的一个特殊点就在于它的闭包和回调特性,这两个特性让初学Javascript的我是云里雾里,至今仍在苦苦摸索与理解.在一番苦思之后,整理了一下资料,将自己的理解思路记录下来,以 ...

  9. MySQL 及 SQL 注入与防范方法

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的, ...

  10. msm8909+android5.1分区及烧录的镜像文件介绍【转】

    本文转载自: EMMC的分区及其保存的文件 Partition label filename 说明 PrimaryGPT gpt_main0.bin modem NON-HLOS.bin sbl1 s ...