HDU.1495 非常可乐 (BFS)
题意分析
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S< 101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出”NO”。
BFS时有6种操作,分别是S->M,S->N,N->S,N->M,M->S,M->N。每次讲这6中情况放入队列,遇到结果输出即可。
若被分的可乐为奇数,那么无法平分,因为给出的可乐都是整数。
代码总览
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define nmax 105
#define inf 1000000
using namespace std;
bool visit[nmax][nmax][nmax];
typedef struct{
int n;
int m;
int s;
int times;
// int type;
}mes;
int N,M,S,ans,Target;
void bfs()
{
queue<mes> q;
while(!q.empty()) q.pop();
mes temp = {0,0,S,0},head;
temp.n = temp.m = temp.times = 0;
temp.s = S;
memset(visit,0,sizeof(visit));
visit[temp.n][temp.m][temp.s] = true;
q.push(temp);
while(!q.empty()){
head = q.front();q.pop();
if((head.m == Target && head.n == Target) || (head.m == Target && head.s == Target) || (head.n == Target && head.s == Target)){
ans = head.times;
return;
}
for(int i = 0;i<6;++i){
temp = head;
if(i == 0){// S->N
if(head.s + head.n < N){
temp.n = head.s + head.n;
temp.s = 0;
}else{
temp.n = N;
temp.s = head.s + head.n - N;
}
}else if(i == 1){// S->M
if(head.s + head.m < M){
temp.m = head.s + head.m;
temp.s = 0;
}else{
temp.m = M;
temp.s = head.s + head.m - M;
}
}else if(i == 2){// N->S
if(head.s + head.n < S){
temp.n = 0;
temp.s = head.s + head.n;
}else{
temp.n = head.s + head.n - S;
temp.s = S;
}
}else if( i == 3){// M->S
if(head.s + head.m < S){
temp.m = 0;
temp.s = head.s + head.m;
}else{
temp.m = head.s + head.m - S;
temp.s = S;
}
}else if(i == 4){// N->M
if(head.m + head.n < M){
temp.n = 0;
temp.m = head.m + head.n;
}else{
temp.m = M;
temp.n = head.m + head.n - M;
}
}else if(i == 5){// M->N
if(head.m + head.n < N){
temp.n = head.m + head.n;
temp.m = 0;
}else{
temp.n = N;
temp.m = head.m + head.n - N;
}
}
if(!visit[temp.n][temp.m][temp.s]){
visit[temp.n][temp.m][temp.s] = true;
// temp.type = i;
temp.times = head.times +1;
//printf("%d %d %d %d %d\n",temp.n,temp.m,temp.s,temp.times,temp.type);
q.push(temp);
}
}
}
}
int main()
{
// freopen("out.txt","w",stdout);
while(scanf("%d %d %d",&S,&N,&M) != EOF){
if(N == 0 && M == 0 && S == 0) break;
if(S%2 !=0){
printf("NO\n");
continue;
}
// printf("N M S TIME\n");
// printf("%d %d %d\n",N,M,S);
ans = inf;
Target = S/2;
bfs();
if(ans == inf) printf("NO\n");
else printf("%d\n",ans);
}
return 0;
}
HDU.1495 非常可乐 (BFS)的更多相关文章
- HDU 1495 非常可乐 BFS 搜索
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...
- HDU 1495 非常可乐 bfs 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=1495 第三个杯子的盛水量可由前两个杯子得到,而前两个杯子状态总数在100*100以内,穷举可实现 #includ ...
- (step4.2.5)hdu 1495(非常可乐——BFS)
题目大意:输入三个整数 a,b,c. a : 可乐瓶的容量,b: 甲杯的容量 ,c: 乙杯的容量.问能否用这三个被来实现饮料的平分???如果可以输出倒饮料的次数, 否则输出NO 解题思路:BFS ...
- HDU 1495 非常可乐 BFS搜索
题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...
- HDU 1495 非常可乐 BFS
题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...
- HDU - 1495 非常可乐 bfs互倒三杯水
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- BFS(倒水问题) HDU 1495 非常可乐
题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 非常可乐---hdu 1495(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意: 有3个杯子a b c:a=b+c:然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相 ...
- HDU 1495 非常可乐(BFS倒水问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...
随机推荐
- python-面向对象-内置方法补充
__del__item系列 __getitem__ __setitem__ __delitem____hash____eq__ 构造方法 申请一个空间析构方法 释放一个空间之前执行某对象借用了操作系统 ...
- TensorFlow深度学习实战---循环神经网络
循环神经网络(recurrent neural network,RNN)-------------------------重要结构(长短时记忆网络( long short-term memory,LS ...
- 理解学习Springboot(一)
Springboot有何优势呢,网上一大推,这里就不写了. 一.配置maven 1.在maven官网下载maven,http://maven.apache.org/download.cgi 2.将下载 ...
- Windows操作系统C盘占用空间过多
Windows操作系统C盘占用空间过多 大部分的windows电脑用户在长时间使用PC时都会遇到一个问题,就是C盘占用的空间会越来越多,乃至占满整个C盘. 后来在百度了一波,发现各种方法都试过了,也不 ...
- myeclipse生成类的帮助文档
http://blog.csdn.net/tabactivity/article/details/11807233
- Alpha 冲刺(6/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...
- (Miller Rabin算法)判断一个数是否为素数
1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先级高于乘除和取模,加减的优先级最低. 见到x^y/z这 ...
- lintcode-433-岛屿的个数
433-岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 样例 在矩阵: [ [1, 1, 0, 0, 0], ...
- 欧拉函数phic以及超大数的快速幂
题目:求a^b*c%mod; 其中b<=10^100000; 是不是很大..... /*当你要计算 A^B%C的时候 因为此题中的B很大,达到10^100000,所以我们应该联想到降幂公式. 降 ...
- WordPress使用淘宝IP地址库的API显示评论者的位置信息(二)
1 淘宝IP地址库的接口说明 在上一篇文章<WordPress使用淘宝IP地址库的API显示评论者的位置信息(一)>中,vfhky使用了新浪工具提供的这个IP接口显示博客评论者的位置信息. ...