非常可乐

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7977    Accepted Submission(s): 3180

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

题解:没有初始化,错了半天。。。。。。我真是无语了;直接队列定义在bfs里面就行了

代码1:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
int S,M,N;
int vis[][];
struct Node{
int s,m,n,step;
};
bool check(Node a){
int x,y,z;
x=a.s;y=a.m;z=a.n;
int flot=;
if(!x)flot++;if(!y)flot++;if(!z)flot++;
if(flot!=)return false;
flot=;
if(x)if(x*==S)flot++;
if(y)if(y*==S)flot++;
if(z)if(z*==S)flot++;
if(flot==)return true;
else return false;
}
void bfs(){
Node a,b;
memset(vis,,sizeof(vis));
queue<Node>dl;
a.s=S;
a.m=;
a.n=;
a.step=;
dl.push(a);
vis[a.m][a.n]=;
while(!dl.empty()){
a=dl.front();
dl.pop();
if(a.m<M){//s-m
if(a.s>=M-a.m){
b.s=a.s-(M-a.m);
b.m=M;
b.n=a.n;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.m=a.m+a.s;
b.s=;
b.n=a.n;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
if(a.n<N){//s-n
if(a.s>=N-a.n){
b.s=a.s-(N-a.n);
b.n=N;
b.m=a.m;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.n=a.n+a.s;
b.s=;
b.m=a.m;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
if(a.s<S){//m-s
if(a.m>=S-a.s){
b.m=a.m-(S-a.s);
b.s=S;
b.n=a.n;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.s=a.s+a.m;
b.n=a.n;
b.m=;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
if(a.n<N){//m-n
if(a.m>=N-a.n){
b.m=a.m-(N-a.n);
b.s=a.s;
b.n=N;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.n=a.n+a.m;
b.s=a.s;
b.m=;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
if(a.s<S){//n-s
if(a.n>=S-a.s){
b.n=a.n-(S-a.s);
b.s=S;
b.m=a.m;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.s=a.s+a.n;
b.m=a.m;
b.n=;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
if(a.m<M){//n-m
if(a.n>=M-a.m){
b.n=a.n-(M-a.m);
b.s=a.s;
b.m=M;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
else{
b.m=a.m+a.n;
b.s=a.s;
b.n=;
b.step=a.step+;
if(check(b)){
printf("%d\n",b.step);
return;
}
if(!vis[b.m][b.n]){
vis[b.m][b.n]=;
dl.push(b);
}
}
}
}
puts("NO");
}
int main(){
while(~scanf("%d%d%d",&S,&M,&N),S|M|N){
if(S&)puts("NO");
else bfs();
}
return ;}

代码2:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=0x3f3f3f3f;
int c[];
int vis[][];
struct Node{
int v[],step;
};
bool check(Node a){
int x,y,z;
x=a.v[];y=a.v[];z=a.v[];
int t=c[]/;
//printf("%d %d %d %d\n",x,y,z,t);
if(x==t&&y==t)return true;
if(y==t&&z==t)return true;
if(x==t&&z==t)return true;
return false;
}
void bfs(){
Node a,b;
memset(vis,,sizeof(vis));
queue<Node>dl;
a.v[]=c[];
a.v[]=;
a.v[]=;
a.step=;
dl.push(a);
vis[a.v[]][a.v[]]=;
while(!dl.empty()){
a=dl.front();
dl.pop();
for(int i=;i<;i++)
for(int j=;j<;j++){
if(i==j)continue;
b=a;
b.step=a.step+;
if(b.v[i]>=c[j]-b.v[j]){
b.v[i]=b.v[i]-(c[j]-b.v[j]);
b.v[j]=c[j];
}
else{
b.v[j]+=b.v[i];
b.v[i]=;
}
if(check(b)){
printf("%d\n",b.step);return;
}
if(!vis[b.v[]][b.v[]]){
dl.push(b);vis[b.v[]][b.v[]]=;
}
}
}
puts("NO");
}
int main(){
while(~scanf("%d%d%d",c,c+,c+),c[]|c[]|c[]){
if(c[]&)puts("NO");
else bfs();
}
return ;}

非常可乐(bfs)的更多相关文章

  1. HDU1459 非常可乐(BFS) 2016-07-24 15:00 165人阅读 评论(0) 收藏

    非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶 ...

  2. HDU1495 非常可乐 —— BFS + 模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 非常可乐 Time Limit: 2000/1000 MS (Java/Others)    M ...

  3. (step4.2.5)hdu 1495(非常可乐——BFS)

    题目大意:输入三个整数 a,b,c.   a : 可乐瓶的容量,b: 甲杯的容量 ,c: 乙杯的容量.问能否用这三个被来实现饮料的平分???如果可以输出倒饮料的次数, 否则输出NO 解题思路:BFS ...

  4. HDU 1495 非常可乐 BFS搜索

    题意:有个为三个杯子(杯子没有刻度),体积为s,n,m,s=m+n, 刚开始只有体积为s的杯子装满可乐,可以互相倒,问你最少的次数使可乐均分,如果没有结果,输出-1; 分析:直接互相倒就完了,BFS模 ...

  5. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

  6. hdu_1495_非常可乐(bfs模拟)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意:不解释 题解:BFS模拟,不过要细心,把所有情况都列举出来,开一个数组记录状态,代码有点长 ...

  7. HDU 1495 非常可乐 BFS

    题目大意:中文题不说了. 题目思路:我有同学用GCD数论写出来的代码很简洁,但是很抱歉,数论蒟蒻,我觉得比赛的时候我没办法推出.如果用BFS的话思路很简单的,就是6方向广搜,只不过稍微麻烦点.具体看代 ...

  8. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...

  9. HDU - 1495 非常可乐 bfs互倒三杯水

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. HDU 1495 非常可乐 bfs 难度:1

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 第三个杯子的盛水量可由前两个杯子得到,而前两个杯子状态总数在100*100以内,穷举可实现 #includ ...

随机推荐

  1. ASP.NET MVC View向Controller传值方式总结

    1:QueryString传值1)也可以使用new{}来为form的action增加querystring2)在controler里使用Request.QueryString["word&q ...

  2. mongodb数据库调试问题:‘db object already connecting, open cannot be called multiple times’

    在微博小系统的调试过程中: (1)登入登出可以正常显示,就是在注册的时候网络连接突然停止,但是用户名和密码已经存入数据库中,报错为:undefined is not a function 错误主要指向 ...

  3. jquery.validate 一些技巧

    1.Validator.element() Validates a single element, returns true if it is valid, false otherwise. http ...

  4. C# WinForm判断Win7下是否是管理员身份运行

    原文:C# WinForm判断Win7下是否是管理员身份运行 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 ...

  5. WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)

    原文 http://www.cnblogs.com/mgen/archive/2011/06/19/2084553.html 示例程序: 如上程序截图,一目了然典型的主从模式绑定应用,如果里面的数据不 ...

  6. Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages

    Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages Web网页中动态数据区域的识别 ...

  7. Hibernate 配置详解(12) 补充

    hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...

  8. 2015 11 27编写JAVA程序

    在任意文件下 ,建立一个文本文档,更改其txt格式为java格式, 打开此程序的同时打开eclipse可编写代码. public class 文件名{ public static void main( ...

  9. qt4.8.4安装以及64位程序编译方法

    本文将使用简单的几个步骤说明在vc2008和64位的操作系统下如何编译安装x64Qt软件 首先必须保证你所使用的系统是64bit的操作系统,本次我们使用的系统是windows7 professiona ...

  10. 某IT校招笔试

    前言 博主明天上午9点还有面试,今天突然看到某大牌IT公司笔试题目,必须做一下了 题目 1.假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 A: h(K)=K/N; B: h(K) ...