非常可乐

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

_________________________________________________________________

题目说白了无非a倒到bc,b倒到ac,c倒到ab,6中情况,分别对6种进行广搜,代码很长都是复制的


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
using namespace std; int vir[105][105][105]; struct node
{
int a,b,c,va,vb,vc,cnt;;
}; bool out(node f)
{
if(f.a==f.b&&f.c==0)
return 1;
if(f.a==f.c&&f.b==0)
return 1;
if(f.c==f.b&&f.a==0)
return 1;
return 0;
} int bfs(int s,int m,int n)
{
queue<node>q;
node f,d;
f.va=d.va=s;
f.vb=d.vb=m;
f.vc=d.vc=n;
f.a=s;
f.b=0;
f.c=0;
f.cnt=0;
vir[f.a][f.b][f.c]=1;
q.push(f);
while(!q.empty())
{
f=q.front();
q.pop(); if(out(f))
{
return f.cnt;
}
//a->bc
if(f.a>0)
{
//a->b
d.c=f.c;
if(f.a<=f.vb-f.b)//a-all>b
{
d.a=0;
d.b=f.b+f.a;
}
else
{
d.a=f.a-(f.vb-f.b);
d.b=d.vb;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
} //a->c
d.b=f.b;
if(f.a<=f.vc-f.c)//a-all>c
{
d.a=0;
d.c=f.c+f.a;
}
else
{
d.a=f.a-(f.vc-f.c);
d.c=d.vc;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
}
} //b->ac
if(f.b>0)
{
//b->a
d.c=f.c;
if(f.b<=f.va-f.a)//b-all>a
{
d.b=0;
d.a=f.a+f.b;
}
else
{
d.b=f.b-(f.va-f.a);
d.a=d.va;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
} //b->c
d.a=f.a;
if(f.b<=f.vc-f.c)//a-all>c
{
d.b=0;
d.c=f.c+f.b;
}
else
{
d.b=f.b-(f.vc-f.c);
d.c=d.vc;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
}
} //c->ab
if(f.c>0)
{
//c->b
d.a=f.a;
if(f.c<=f.vb-f.b)//c-all>b
{
d.c=0;
d.b=f.b+f.c;
}
else
{
d.c=f.c-(f.vb-f.b);
d.b=d.vb;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
} //c->a
d.b=f.b;
if(f.c<=f.va-f.a)//c-all>a
{
d.c=0;
d.a=f.a+f.c;
}
else
{
d.c=f.c-(f.va-f.a);
d.a=d.va;
}
if(vir[d.a][d.b][d.c]==0)
{
vir[d.a][d.b][d.c]=1;
d.cnt=f.cnt+1;
q.push(d);
}
}
}
return -1;
} int main()
{
int s,m,n;
while(~scanf("%d%d%d",&s,&m,&n)&&(s||m||n))
{
if(s%2)
printf("NO\n");
else
{
memset(vir,0,sizeof(vir));
int ans=bfs(s,m,n);
if(ans==-1)
printf("NO\n");
else
printf("%d\n",ans);
} }
return 0;
}

HDU1459 非常可乐(BFS) 2016-07-24 15:00 165人阅读 评论(0) 收藏的更多相关文章

  1. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  2. Codeforces816A Karen and Morning 2017-06-27 15:11 43人阅读 评论(0) 收藏

    A. Karen and Morning time limit per test 2 seconds memory limit per test 512 megabytes input standar ...

  3. Hadoop常见异常及其解决方案 分类: A1_HADOOP 2014-07-09 15:02 4187人阅读 评论(0) 收藏

    1.Shell$ExitCodeException 现象:运行hadoop job时出现如下异常: 14/07/09 14:42:50 INFO mapreduce.Job: Task Id : at ...

  4. c/c++,输入一个字符 2014-11-20 07:00 30人阅读 评论(0) 收藏

    getch().getche()和getchar()函数     (1) getch()和getche()函数     这两个函数都是从键盘上读入一个字符.其调用格式为:      getch(); ...

  5. iOS正则表达式 分类: ios技术 2015-07-14 14:00 35人阅读 评论(0) 收藏

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  6. PIE(二分) 分类: 二分查找 2015-06-07 15:46 9人阅读 评论(0) 收藏

    Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  7. 苹果应用商店AppStore审核中文指南 分类: ios相关 app相关 2015-07-27 15:33 84人阅读 评论(0) 收藏

    目录 1. 条款与条件 2. 功能 3. 元数据.评级与排名 4. 位置 5. 推送通知 6. 游戏中心 7. 广告 8. 商标与商业外观 9. 媒体内容 10. 用户界面 11. 购买与货币 12. ...

  8. Find The Multiple 分类: 搜索 POJ 2015-08-09 15:19 3人阅读 评论(0) 收藏

    Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21851 Accepted: 8984 Sp ...

  9. Basic 分类: POJ 2015-08-03 15:49 3人阅读 评论(0) 收藏

    Basic Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 905 Accepted: 228 Description The p ...

随机推荐

  1. Hibernate 的Ehache学习

    Hibernate默认二级缓存是不启动的,启动二级缓存(以EHCache为例)需要以下步骤: 1.添加相关的包: Ehcache.jar和commons-logging.jar,如果hibernate ...

  2. 安装Anaconda以及jupyter的使用

    1)下载https://www.anaconda.com/download/ 2)安装 3)终端查看(Anaconda Prompt) 4)升级所有的包 初次安装下的软件包版本一般都比较老旧,因此提前 ...

  3. Ajax的get方式传值 避免& 与= 号

    js代码 例如: var name = $("#name”).value;//为a&b=7 name=encodeURLComponent(name); 可以将a&b=7转化 ...

  4. avalon.js 文字显示更多与收起

    isShowMore: function (content) { if(content && content.length >= 124){ var shortContent = ...

  5. luoguP3367 [模板]并查集

    题目链接:https://www.luogu.org/problemnew/show/P3367 思路: 今天学了新算法——并查集,本题是简单的并查集题的模板. 核心思想是“递归+压缩路径”. 并查集 ...

  6. np.random.randn()、np.random.rand()、np.random.randint()

    (1)np.random.randn()函数 语法: np.random.randn(d0,d1,d2……dn) 1)当函数括号内没有参数时,则返回一个浮点数: 2)当函数括号内有一个参数时,则返回秩 ...

  7. django的流程分析

    首先实现一个前端输入网址,后端返回不同的html文件的步骤 一.配置django 1.创建工程 2.创建app 二.配置setting 1.配置templates路径 2.注释跨站请求 三.配置pro ...

  8. 349. Intersection of Two Arrays 是否重复

    不重复的: 方法一 [一句话思路]:排序之后用归并. [一刷]: 根据返回方法的类型来判断corner case.判断空.0数组的corner case还不一样,得分开写 由于先排序了,nums1[i ...

  9. Java中spring读取配置文件的几种方法

    Spring读取配置XML文件分三步: 一.新建一个Java Bean: package springdemo; public class HelloBean { private String hel ...

  10. Spring集成Redis使用注解

    转载:http://blog.csdn.net/u013725455/article/details/52129283 使用Maven项目,添加jar文件依赖: <project xmlns=& ...