非常可乐

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. Python Geospatial Development reading note(1)

    chapter 1, Summary: In this chapter, we briefly introduced the Python programming language and the m ...

  2. Oracle job procedure

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  3. <四> SQL存储过程

    存储过程的定义: create procedure procedurename @param1 nvarchar(30) as select * from tablename where name = ...

  4. Spring MVC 注解和XML的区别

      注解与XML配置的区别 注解:是一种分散式的元数据,与源代码紧绑定. xml:是一种集中式的元数据,与源代码无绑定. 因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码绑定/无绑定. ...

  5. nutch 生产者队列的大小如何控制 threadcount * 50

    如果topN 设置为1000万 ,不会这1000万都放到QueueFeeder(内存)中,而是从文件系统中(hdfs)中迭代不断填充QueueFeeder.队列中默认存放 threadcount * ...

  6. SQL Union和SQL Union All用法

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  7. 如何启动 SQL Server Agent(SQL Server 配置管理器)

    如何启动 SQL Server Agent(SQL Server 配置管理器) SQL Server 2008 R2 其他版本   4(共 6)对本文的评价是有帮助 - 评价此主题 可以从 SQL S ...

  8. POJ3663

    题意简单. 关键:记录每头牛的val值,每次寻找和某头牛匹配的牛时候,可以通过刚刚记录的值来计算. #include<stdio.h> #include<string.h> # ...

  9. 目标识别:Bag-of-words表示图像

    BOW (bag of words) 模型简介 Bag of words模型最初被用在文本分类中,将文档表示成特征矢量.它的基本思想是假定对于一个文本,忽略其词序和语法.句法,仅仅将其看做是一些词汇的 ...

  10. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-004- 处理上传文件

    一.用 MultipartFile 1.在html中设置<form enctype="multipart/form-data">及<input type=&quo ...