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) ...
随机推荐
- 一起来做chrome扩展《页面右键菜单》
本文主要内容 contextMenus的设置 打开权限 创建菜单 点击菜单 background script向content script发送消息 1. contextMenus的设置 1.1 打开 ...
- loadrunner-录制脚本,设置代理,参数化,校验点,关联
详细记录一个脚本制作过程相关知识点 制作脚本 因为要做网页所以选择web协议,根据实际需要选择 选择浏览器地址,打开的网页网址,脚本存储地址以及初始化脚本,初始化脚本的目的是执行用例后不再执行此脚本中 ...
- Vue学习计划基础笔记(一) - vue实例
最近又重新看vue的文档了,计划是别人写的,之前看过一次,没有考虑太多,只考虑看懂能用就好.看完之后写过写demo,现在是零实际项目经验的,所以这一次打算细看,算是官方文档的二次产物吧,但是不是全部直 ...
- js-jQuery对象与dom对象相互转换(转载)
核心提示:jquery选择器得到的jquery对象和标准的 javascript中的document.getElementById()取得的dom对象是两种不同的对象类型,一般情况下,如S(’#id’ ...
- LibLas学习笔记
LibLas学习笔记 las 什么是Las格式 LAS文件格式是数据用户之间交换三维点云数据的公共文件格式. 虽然这种格式主要用于交换激光雷达点云数据,但是它支持交换任何三维的x.y.z 数组. 这 ...
- nordic-mesh中应用的代码实现
nordic-mesh中应用的代码实现 Nordic-Mesh遵循SIG-Mesh-Profile中的mesh定义,实现了element.model等概念. 一个应用中包含一个或多个element,e ...
- 关于Amazon.com Seller 网络以及IP地址更换 官方回答
Greetings from Amazon Seller Support, I understand your concern that there will be a change of IP ad ...
- 5.airflow问题
1. Traceback (most recent call last): File "/usr/bin/airflow", line 28, in <module> ...
- 卡特兰数(Catalan)及其应用
卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...
- OrderSys---Spring 计划(第一天)
Sprint 计划会议: 目标: 1.了解需求分析书的内容 2.划分OrderSys的功能模块 3.开始制作原型 Sprint 3 Backlog细化: ID Name Est How to demo ...