非常可乐

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. Haskell语言学习笔记(46)Parsec(3)

    Applicative Parsing 使用 Applicative 式的 Parser. 包括使用 (<$>), (<*>), (<$), (<*), (*> ...

  2. adb连接过程中常见问题解决方法

    在测试过程中经常会遇到需要使用adb连接服务器的问题,但是有时候经常会遇到连不上的情况,总结两种解决方式 1)error: unknown host service 此问题是由于端口号已经被占用了,可 ...

  3. python的可变list和不可变tuple, dict和set

    list和tuple 在python中分为可变表和不可变表: 类型 名称 表示方法 可变 list [] 不可变 tuple () list list是可变表,list内部索引从0开始,正整数是正序的 ...

  4. Linux运维就业技术指导(九)期末架构考核

    一,毕业架构设计考核筹备 1.1,架构图模板示例 1.1.1 架构图(一)概述 本架构是4层lvs负载均衡给后方7层nginx反向代理: 业务进行了动静分离: 数据库前端有memcached缓存组,降 ...

  5. [Fiddler] The connection to 'xxxxx.com' failed. <br />System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https&gt; HTTPS handshake to intelte

    最近利用模拟发get请求的时候出现: [Fiddler] The connection to ‘xxxxx.com' failed. <br />System.Security.Secur ...

  6. Bean Validation技术实现对Javabean的校验

    概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validat ...

  7. Cannot create inner bean '(inner bean)#67f903b5' of typ

    严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error crea ...

  8. ECMAScript5新特性之isFrozen、freeze

    对象被冻结后: 1 不能添加属性. 2 不能删除属性. 3 不能修改属性.(赋值) 4 不能修改属性描述符.(会抛异常) var fruit = { name : '苹果', desc : '红富士' ...

  9. Django的models操作

    一.先看单表操作 增 方式1: models.book.objects.create( Book_name = "aaa", Book_info = "bbb" ...

  10. [leetcode]340. Longest Substring with At Most K Distinct Characters至多包含K种字符的最长子串

    Given a string, find the length of the longest substring T that contains at most k distinct characte ...