题目链接

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

题意:

容量分别是N 毫升和M 毫升,可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。能平分的话请输出最少要倒的次数,否则输出"NO"。

分析:

广搜,每一个队头元素都要进行6次操作,如图进行了n->m一次操作:

对应的6中操作(S->N,S->M,N->S,N->M,M->S,M->N)

此图必须注意:n,m的意思为:瓶子n中此刻存在的可乐量为n,瓶子m中此刻存在的可乐量为m

注意:从一个瓶倒进另一个瓶时必须分两种情况,1:能装满2:不能装满

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std; struct node
{
int x[3];
int len;
}; queue<node>q; int map[101][101][101];//记录三个状态是否出现过 int dx[3];//三个容器分别最多可以装多少水
double isok; int bfs(int x,int y,int z,int xx)
{
memset(map,0,sizeof(map));
while(!q.empty())
{
q.pop();
}
node p;
p.x[0]=x;
p.x[1]=y;
p.x[2]=z;
p.len=0;
q.push(p);
while(!q.empty())
{
node p=q.front();
q.pop();
if((p.x[0]==p.x[1]&&p.x[1]==xx)||(p.x[0]==p.x[2]&&p.x[0]==xx)||(p.x[1]==p.x[2]&&p.x[1]==xx))
{
return p.len;
}
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(i==j)continue;
node p1;
if(p.x[i]<=dx[j]-p.x[j])//第j个杯子是否可以装下p.x[i]的水
{
p1.x[j]=p.x[j]+p.x[i];
p1.x[i]=0;
}
else//不能倒下p.x[i]的水。则倒一部分进去
{
p1.x[i]=p.x[i]-(dx[j]-p.x[j]);
p1.x[j]=dx[j];
}
for(int k=0; k<3; k++)
{
if(k!=i&&k!=j)
{
p1.x[k]=p.x[k];
}
}
p1.len=p.len;
if(map[p1.x[0]][p1.x[1]][p1.x[2]]==1)
continue;
map[p1.x[0]][p1.x[1]][p1.x[2]]=1;
p1.len++;
q.push(p1);
}
}
}
return -1;
} int main()
{
int s,n,m;
while(~scanf("%d%d%d",&s,&n,&m))
{
if(s==0&&n==0&&m==0)break;
if(s%2)//可乐总体积是奇数的话,肯定是不能够平分的
{
printf("NO\n");
}
else
{
dx[0]=s,dx[1]=n,dx[2]=m;
int re=bfs(s,0,0,s/2);
if(re==-1)
printf("NO\n");
else
printf("%d\n",re);
}
}
return 0;
}

hdu 1495 非常可乐 (广搜)的更多相关文章

  1. hdu 1495 非常可乐 广搜

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> ][][]; ...

  2. HDU ACM 1495 非常可乐(广搜BFS)

    非常可乐 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  3. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

  4. HDU 1495 非常可乐 (只是转了个弯的广搜题)

    N - 非常可乐 =========================================================================================== ...

  5. HDU 1495 非常可乐 BFS

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

  6. HDU 1495 非常可乐(数论,BFS)

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

  7. HDU 1495 非常可乐

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103711#problem/M /*BFS简单题 链接地址: http://acm.hdu ...

  8. HDU 1495 非常可乐 BFS 搜索

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

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

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

随机推荐

  1. Asp.net MVC area

    妈的,今天去携程面试,技术面了三轮,竟然让我走了,没有然后了,你不要老子,干嘛还面那么多轮,害的老子一上午的时间没了,气死我了. 好了,总结下面试中的问题吧, 1.GC 2.设计模式 3.做过的项目的 ...

  2. isset与empty 的区别

    isset()与empty()函数的区别,isset()只需要验证一个值是否存在: 而empty()不但需验证这个值是否存在,还需检验它的值是否非空和非0: 注:isset()只检验一个变量是否已经设 ...

  3. validate效验规则

    ] } }, messages:{ name:{ required:"最少为2个字!" }, tel:{ required:"请填写手机号码!", isMobi ...

  4. 通过ClientDataSet复制表的结构及数据

    1.  需要2个ClientDataSet组件: 2.  clientDataSet1连接目标表,clientDataSet2连接源表,如果无法直接连接,使用DataSetProvider进行桥接: ...

  5. P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作aaa 如果输入序列不为空,将第一个元素压入栈S1​ 操作b 如果 ...

  6. c++11 右尖括号>改进

    c++11 右尖括号>改进 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...

  7. Pythonの坑

    Python closures and late binding A closure occurs when a function has access to a local variable fro ...

  8. BZOJ4870 [Shoi2017]组合数问题 【组合数 + 矩乘】

    题目链接 BZOJ4870 题解 \[ans = \sum\limits_{i = 0}^{\infty}{nk \choose ik + r} \pmod p\] 发现实际是求 \[ans = \s ...

  9. 解题:BZOJ 2673 World Final 2011 Chips Challenge

    题面 数据范围看起来很像网络流诶(滚那 因为限制多而且强,数据范围也不大,我们考虑不直接求答案,而是转化为判定问题 可以发现第二个限制相对好满足,我们直接枚举这个限制就可以.具体来说是枚举所有行中的最 ...

  10. 【题解】CF1154

    A Description 有三个正整数 \(a,~b,~c\),现在给定 \(x_1~=~a + b,~x_2~=~a + c, x_3~=~b + c, ~x_4~=~a + b + c\),请求 ...