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

思路:将所有状态进行一次广搜即可,代码虽长,但基本都是复制粘贴

#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;
int s,n,m;
int vis[105][105][105];
struct node
{
int s,n,m,step;
};
int check(int x,int y,int z)//平分条件
{
if(x == 0 && y == z)
return 1;
if(y == 0 && x == z)
return 1;
if(z == 0 && x == y)
return 1;
return 0;
}
int bfs()
{
queue<node> Q;
node a,next;
a.s = s;
a.n = 0;
a.m = 0;
a.step = 0;
vis[s][0][0] = 1;
Q.push(a);
while(!Q.empty())
{
a = Q.front();
Q.pop();
if(check(a.s,a.n,a.m))
return a.step;
if(a.n)//当n杯中还有
{
if(a.n>s-a.s)//将n杯倒入s杯中能将s杯倒满
{
next = a;
next.n = next.n-(s-a.s);
next.s = s;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else//将n杯倒入s杯中不能将s杯倒满
{
next = a;
next.s = next.n+next.s;
next.n = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
if(a.n>m-a.m)//将n杯倒入m杯中能将m杯倒满
{
next = a;
next.n = next.n-(m-a.m);
next.m =  m;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else//将n杯倒入m杯中不能将m杯倒满
{
next = a;
next.m = next.n+next.m;
next.n = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
}
if(a.m)//同上
{
if(a.m>s-a.s)
{
next = a;
next.m = next.m-(s-a.s);
next.s = s;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else
{
next = a;
next.s = next.m+next.s;
next.m = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
if(a.m>n-a.n)
{
next = a;
next.m = next.m-(n-a.n);
next.n =  n;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else
{
next = a;
next.n = next.m+next.n;
next.m = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
}
if(a.s)//同上
{
if(a.s>n-a.n)
{
next = a;
next.s = next.s-(n-a.n);
next.n = n;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else
{
next = a;
next.n = next.s+next.n;
next.s = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
if(a.s>m-a.m)
{
next = a;
next.s = next.s-(m-a.m);
next.m =  m;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
else
{
next = a;
next.m = next.m+next.s;
next.s = 0;
if(!vis[next.s][next.n][next.m])
{
next.step = a.step+1;
Q.push(next);
vis[next.s][next.n][next.m] = 1;
}
}
}
}
return 0;
}
int main()
{
int ans;
while(~scanf("%d%d%d",&s,&n,&m),s||n||m)
{
if(s%2)//奇数肯定不能平分,因为被子是整数体积大小
{
printf("NO\n");
continue;
}
memset(vis,0,sizeof(vis));
ans = bfs();
if(ans)
printf("%d\n",ans);
else
printf("NO\n");
}
return 0;
}

HDU1495:非常可乐(BFS)相关推荐

  1. HDU1495 非常可乐【倒水问题+BFS】

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

  2. 【HDU1495非常可乐】【POJ3414Pots】

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

  3. HDU1495 非常可乐

    问题链接:HDU1495 非常可乐. 题意简述:平分液体问题.输入s.n和m三个数,分别代表可乐和2个杯子,三个容器可以互相倒,问能不能把s中的可乐平分,能的话输出最小倒杯子的次数,不能就输出NO. ...

  4. HDU1495 非常可乐 【BFS】

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

  5. hdu1495 非常可乐(bfs)

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

  6. hdu 1495 非常可乐 (bfs)

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

  7. HDU 1495 非常可乐(BFS||数论)

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

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

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

  9. hdu 1495非常可乐 BFS

    文章目录 AC代码 TLE ???为啥啊?不知道哪里不对,导致超时 对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = ... AC代 ...

最新文章

  1. 【机器学习基础】算法工程师必备的机器学习--EM
  2. 三维重建9:点云图像的滤波方法小结
  3. SAP Cloud for Customer的产品主数据通过PI同步到CRM
  4. java移动端接口测试_走进Java接口测试之测试框架TestNG数据驱动(入门篇)
  5. 2002. [HNOI2010]弹飞绵羊【LCT】
  6. SLAM--Pangolin显示相机位姿
  7. FusionChartsFree在JSP中的用法
  8. 【bzoj1143: [CTSC2008]祭祀river】有向无环图的最长反链
  9. WEB学习第四天(网页模型
  10. android代码签名和混淆打包
  11. 重庆邮电大学计算机学硕考研经验,重庆邮电大学计算机考研复试备考经验及经过...
  12. Oracle学习——dmp文件(表)导入与导出
  13. java--案例:[Random]随机100-200的数、班级点名器、控制台输入三个数,输出最大值,或最小值?
  14. STM32—LED单灯闪烁之软件延时
  15. 国际版阿里云短信对接
  16. web 移动端开发基础
  17. cisco 华三 对接_H3C交换机与Cisco交换机STP协议对接注意事项
  18. I.MX6ULL开发板基于阿里云项目实战 6:遇到的问题,解决方法及项目总结
  19. js获取随机数与随机颜色函数的简单封装
  20. [HNOI2006]公路修建问题 ——二分答案+krukal(蒟弱个人总结)

热门文章

  1. 【AUTOSAR-COM】-9.1-Tx/Rx Ipdu两种处理模式:IMMEDIATE和DEFERRED详解
  2. 北京周边1-5小时高铁出行旅游攻略!
  3. CSS中line-height属性
  4. 宏碁E5-471G-57WZ拆机加内存图解
  5. ARM GIC(五) ARM TrustZone如何支持安全中断 分析笔记。
  6. arduino新手入门详细教程系列之【Ⅱ:arduino编程环境配置】
  7. Cache原理简介及cache miss
  8. 计算机专业工作紧张熬夜吗,性别:男,年龄:35,合肥,从事工作:计算机,性格内向,生活和工作压力大,人好紧张焦虑,前几年总是加.....
  9. 前58同城高级副总裁宋波及总监郭冬涉嫌受贿被警方刑拘
  10. tpm2-tools 使用方法