非常可乐

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

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
 
题解:自己构图遍历所有可能情况  
 1  a->b  a倒入b
     a->c  a倒入c
2   b->a 
     b->c
3   c->a
     c->b
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#define INF 0x3f3f3f
#define MAX 100+10
using namespace std;
int s,n,m,k;
int map[MAX][MAX][MAX];
struct node
{
int a,b,c,step;
friend bool operator <(node x,node y)
{
return x.step>y.step;
}
};
void bfs()
{
node now,next;//用next表示上一次,now表示当前
priority_queue<node> q;
now.a=s;
now.b=0;
now.c=0;
now.step=0;
q.push(now);
map[now.a][now.b][now.c]=1;
while(!q.empty())
{
next=q.top();
q.pop();
if(next.a==k&&next.b==k||next.a==k&&next.c==k||next.b==k&&next.c==k)
{
printf("%d\n",next.step);
return ;
}
/*a杯子倒进b,c两个里面*/
/*先倒进b杯子里*/
if(next.b!=n&&next.a)//前提b杯子不能满
{
if(next.a>(n-next.b))// 把a杯子的水倒满b a还有剩余
{
now.a=next.a-(n-next.b);
now.b=n;
now.c=next.c;//c杯子不变
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;//记录状态
q.push(now);
}
}
else//a杯子水倒不满b
{
now.a=0;
now.b=next.a+next.b;
now.c=next.c;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
}
/*倒进c杯子里面*/
if(next.c!=m&&next.a)//前提c杯子不能满 a杯子水不能为空
{
if(next.a>(m-next.c))//倒满还有剩余
{
now.a=next.a-(m-next.c);
now.b=next.b;//b杯子不变
now.c=m;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
else//倒不满
{
now.a=0;
now.b=next.b;
now.c=next.c+next.a;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
}
/*b杯子水倒进a,c里面*/
/*先倒进a*/
if(next.b&&next.a!=s)//b杯子水不能为空 且a杯子水不能满
{
if(next.b>(s-next.a))//倒满还有剩余
{
now.a=s;
now.b=next.b-(s-next.a);
now.c=next.c;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
else//倒不满
{
now.a=next.b+next.a;
now.b=0;
now.c=next.c;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
}
/*倒进c*/
if(next.b&&next.c!=m)//b杯子水不能为空 且c杯子水不能满
{
if(next.b>(m-next.c))//倒满还有剩余
{
now.a=next.a;
now.b=next.b-(m-next.c);
now.c=m;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
else//倒不满
{
now.a=next.a;
now.b=0;
now.c=next.c+next.b;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
}
/*c杯子倒进a,b里面*/
/*先 a*/
if(next.c&&next.a!=s)
{
if(next.c>(s-next.a))//倒满还有剩余
{
now.a=s;
now.b=next.b;
now.c=next.c-(s-next.a);
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
else//倒不满a
{
now.a=next.a+next.c;
now.b=next.b;
now.c=0;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
} }
}
/*倒进b*/
if(next.c&&next.b!=n)
{
if(next.c>(n-next.b))//倒满还有剩余
{
now.a=next.a;
now.b=n;
now.c=next.c-(n-next.b);
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
else//倒不满b
{
now.a=next.a;
now.b=next.b+next.c;
now.c=0;
if(!map[now.a][now.b][now.c])//没有出现该状态
{
now.step=next.step+1;
map[now.a][now.b][now.c]=1;
q.push(now);
}
}
}
}
printf("NO\n");
}
int main()
{
int t,i,j,sum;
while(scanf("%d%d%d",&s,&n,&m)&&(s!=0||n!=0||m!=0))
{
if(s&1)
{
printf("NO\n");
continue;
}
memset(map,0,sizeof(map));
k=s/2;
bfs();
}
return 0;
}

  

hdoj 1495 非常可乐【bfs隐式图】的更多相关文章

  1. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  2. HDOJ 1495 非常可乐 【BFS】

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

  3. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  4. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  5. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  6. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  7. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

  8. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  9. HDU 1495 非常可乐 BFS 搜索

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

随机推荐

  1. ios App优化

    一. 静态分析(Analyze) 在Xcode菜单栏中点击 ”Product“ -> "Analyze",编译完成后项目工程中可能造成内存泄露的代码就会被标记出来,这样我们就 ...

  2. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  3. 对 APM 用户的一次真实调查分析(上)

    一.前言 国内的 APM 行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的 APM 企业,例如,OneAPM,APPdynamic,Dynami ...

  4. android 小米手机连接到电脑adb无法识别 解决方案

    下载并安装小米手机助手 它会自动帮你安装驱动程序 安装成功后重启一下adb服务 应该就可以了

  5. jsp接收相同复合参数 request.getParameterValues()用法

    在网站中往往需要用户选择复选框,此时需要创建多个复选框让用户进行选择: <head> <meta http-equiv="Content-Type" conten ...

  6. memcached远程 telnet 无法连接,解决方案

    因为默认的Memcached配置,使用了本机ip:127.0.0.1 ,此时利用VI修改下配置 vi /etc/memcached.conf 文件打开后,修改下,把-l前面加入#号注释掉,重启服务器就 ...

  7. minicom installation and configuration on ubuntu

    minicom是一个串口通信工具,就像Windows下的超级终端,可用来与串口设备通信.minicom完全通过键盘实现操作. install sudo apt-get install minicom ...

  8. hdu4678Mine

    http://acm.hdu.edu.cn/showproblem.php?pid=4678 之前写了一并差集找连通块 貌似不对 比赛时写的dfs爆栈了 只好用bfs了 单独数字块  为1 空白+数字 ...

  9. bzoj1670

    第一道凸包 采用Andrew算法,不论实现还是理解都非常简单 ..] of longint;     i,j,k,m,n:longint;     ans:double; procedure swap ...

  10. 【转】在Xcode中使用Git进行源码版本控制 -- 不错

    原文网址:http://www.cocoachina.com/ios/20140524/8536.html 本文翻译自Understanding Git Source Control in Xcode ...