非常可乐---hdu 1495(BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1495
题意:
有3个杯子a b c;a=b+c;然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相倒,假如说a倒入b中,只有当b满或a空时,才算倒一次;
a=4,b=1;c=3;
因为刚开始只有a中有;
先让a倒入c中3;step++;
c倒入b中1;step++;
b倒入a中1;step++;此时a和c中各有2;
代码如下:
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- #include<cmath>
- #define N 120
- using namespace std;
- struct node
- {
- int a,b,c,step;
- friend bool operator<(node a,node b)
- {
- return a.step>b.step;
- }
- };
- int vis[N][N][N];
- int BFS(int a,int b,int c)
- {
- node q,p;
- priority_queue<node>Q;
- memset(vis,,sizeof(vis));
- p.a=a;p.b=;p.c=;p.step=;
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- while(!Q.empty())
- {
- q=Q.top();
- Q.pop();
- if((q.a==a/&&q.b==a/)||(q.b==a/&&q.c==a/)||(q.a==a/&&q.c==a/) )
- return q.step;
- if(q.a!=)//a->其他;
- {
- if(q.a<=b-q.b)//a->b;如果a中的全都能倒到b中;
- {
- p.a=;
- p.b=a-q.c;
- p.c=q.c;
- p.step=q.step+;
- }
- else//a不能全到完;因为b满了;
- {
- p.a=a-b-q.c;
- p.b=b;
- p.c=q.c;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- //以下同理;
- if(q.a<=b-q.c)//a->c;如果a中的全都能倒到c中;
- {
- p.a=;
- p.b=q.b;
- p.c=a-q.b;
- p.step=q.step+;
- }
- else//a不能全到完;因为c满了;
- {
- p.a=a-c-q.b;
- p.b=q.b;
- p.c=c;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- }
- if(q.b!=)//b->其他;
- {
- if(q.b<=a-q.a)//b->a;如果b中的全都能倒到a中;
- {
- p.a=a-q.c;
- p.b=;
- p.c=q.c;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- //以下同理;
- if(q.b<=c-q.c)//b->c;如果b中的全都能倒到c中;
- {
- p.a=q.a;
- p.b=;
- p.c=a-q.a;
- p.step=q.step+;
- }
- else//b不能全到完;因为c满了;
- {
- p.a=q.a;
- p.b=a-q.a-c;
- p.c=c;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- }
- if(q.c!=)//c->其他;
- {
- if(q.c<=a-q.a)//c->a;如果c中的全都能倒到a中;
- {
- p.a=a-q.b;
- p.b=q.b;
- p.c=;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- //以下同理;
- if(q.c<=b-q.b)//c->b;如果c中的全都能倒到b中;
- {
- p.a=q.a;
- p.b=a-q.a;
- p.c=;
- p.step=q.step+;
- }
- else//c不能全到完;因为b满了;
- {
- p.a=q.a;
- p.b=b;
- p.c=a-q.a-b;
- p.step=q.step+;
- }
- if(vis[p.a][p.b][p.c]==)
- {
- vis[p.a][p.b][p.c]=;
- Q.push(p);
- }
- }
- }
- return -;
- }
- int main()
- {
- int a,b,c,ans;
- while(scanf("%d%d%d",&a,&b,&c),a+b+c)
- {
- if(a%==)
- {
- printf("NO\n");
- continue;
- }
- else
- {
- ans=BFS(a,b,c);
- if(ans==-)
- printf("NO\n");
- else
- printf("%d\n",ans);
- }
- }
- return ;
- }
非常可乐---hdu 1495(BFS)的更多相关文章
- hdu 1495(BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- 非常可乐 HDU - 1495
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...
- kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495
题目链接:https://vjudge.net/problem/HDU-1495 题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两 ...
- BFS(倒水问题) HDU 1495 非常可乐
题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...
- 【BFS】HDU 1495
直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...
- hdu 4531 bfs(略难)
题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1495 非常可乐 BFS 搜索
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...
随机推荐
- 【代码审计】EasySNS_V1.6 前台XSS跨站脚本漏洞分析
0x00 环境准备 EasySNS官网:http://www.imzaker.com/ 网站源码版本:EasySNS极简社区V1.60 程序源码下载:http://es.imzaker.com/ind ...
- windows防火墙设置端口开放技巧
选择“打开或者关闭windows防火墙”把防火墙打开,然后选择“高级设置”,选择“创建规则”来指定端口.(这里也可以在“入站规则”里选择已经存在的端口.) 指定ip开放3389端口 某新服务器,开放8 ...
- iOS开发-- 设置UIButton的文字显示位置、字体的大小、字体的颜色
btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlS ...
- Nginx(五)-- 配置文件之Rewrite
Rewrite支持URL重写 1.常用指令以及语法 1) if指令 if语法: if 空格 (condition) {} 条件: 1. “=” 来判断相等,用于字符的比较 ...
- C#中的垃圾回收机制与delegate
在DeepStream的C#版本调试过程中,发现了一个问题,运行一段时间后,大概每次内存到16M(Debug模式)就会异常 错误“System.NullReferenceException:未将对象引 ...
- iOS - 扩展UIButton的响应区域
扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...
- JS - url相关
今天在找获取当前网址除去参数的js方式,结果自己会的竟然只有window.location.href 查到的一篇博文: http://www.cnblogs.com/weiyuxinghuacun/a ...
- 查询SQlServer相同表结构差异
USE [数据库名] GO ); ); ); ); SET @DataName1='库1'; SET @DataName2='库2'; SET @TableName1='表1'; SET @Table ...
- XML读取(string形式进行读取)
#region 测试XML二进制读取 string strXmlData = "<xml><ToUserName><![CDATA[gh_ef65912f88f ...
- ThinkPad L421 如何进入BIOS?(已解决)
开机屏幕出现ThinkPad标志时,快速按下 F1键 即可进入BIOS