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) ...
随机推荐
- JavaWeb(十七)——JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- 函数parseQuery用于解析url查询参数
在百度上找的,以后忘了再看. 语法如下: var obj = parseQuery(query) query是被解析的查询参数,函数返回解析后的对象. 使用范例如下: var jerry = pars ...
- 抓包工具Charles学习总结
最近由于工作需要对App进行测试,功能方面还好说,但是在网络测试方面遇到了一些问题.由于公司App是使用https进行通信,直接在路由器上抓包下来,数据包都是加密的,没法看到接口返回的内容,给测试的B ...
- Python接口测试实战1(下)- 接口测试工具的使用
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python range() 函数用法
函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始.默认是从 0 开始.例如range(5)等价于range(0, 5); stop: ...
- MySQL数据库--连接
MySQL数据库的概念: MySQL数据库,包括客户端和服务端.客户端就是操作数据库的终端(命令行.navicat),服务端就是安装有MySQL软件的主机(本机或者服务器),MySQL数据库的端口一般 ...
- localhost/127.0.0.1/本机IP的区别以及端口号
端口号: http请求默认的端口是:80 PHPstudy中的端口号: Apache服务器的端口是:80 MySQL数据库的端口是:3306 PHP项目端口是:9000 禅道中的端口号: Apache ...
- SQL行列乾坤大挪移
“生活总是这样,有时候,你需要一个苹果,但别人却给了你一个梨.” 今天dalao邮件里需要添加一张每月累计长长的图,可是,拿到手上的SQL导出数据不符合我最爱的pyecharts的数据输入格式,头大. ...
- .net core 2.1.3可能引发Could not load file or assembly XXXXX的错误
参考文档: https://github.com/aspnet/Home/issues/3503 写在前面 感觉自己现在干的活离开发越来越远了啊,不过也很好,每天能学到不少东西,中文的,英文的,永远也 ...
- Flip the Bits(思维)
You are given a positive integer n. Your task is to build a number m by flipping the minimum number ...