hdu1495非常可乐
/*此题其实是一道简单的bfs,主要是抽象一下,将两个人的杯子以及可乐瓶抽象为三个容器,且可以互相倒饮料,那么将每种倒饮料的方法枚举出来就6中,两两互相到当然只有6种,此外就是对倒完饮料的判断题目中解释很清楚,别的其实没什么*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vist[105][105][105],a,b,c;
struct node
{int a,b,c;//这里便是将三个瓶子抽象一下为三个容器可以互相倒饮料int step;
}s[105];
void bfs()
{queue<node>q;//加入一个队列memset(vist,0,sizeof(vist));node p1;p1.a=a;p1.b=0;p1.c=0;p1.step=0;q.push(p1);vist[p1.a][0][0]=1;while(!q.empty()){p1=q.front();q.pop();if((p1.a==a/2&&p1.b==a/2)||(p1.a==a/2&&p1.c==a/2)||(p1.b==a/2&&p1.c==a/2))//这里是三种结束的标志,只要人以满足一种那么一定平分饮料{printf("%d\n",p1.step);return;}node p2;if(p1.a!=0)//接下来便是重复的过程当第一个杯子有饮料时{if(p1.a>b-p1.b)//这里是判断当前第一个杯子和第二个杯子装满所需要的饮料体积做比较,如果满足则更新下面{p2.a=p1.a-(b-p1.b);p2.b=b;//注意这个b是容量为m的杯子p2.c=p1.c;p2.step=p1.step+1;}else //这里是上一个if判断的补集吧可以这样理解{p2.a=0;p2.b=p1.b+p1.a;p2.c=p1.c;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}//一下全是上一个判断的思想的重复if(p1.a!=0){if(p1.a>c-p1.c){p2.a=p1.a-(c-p1.c);p2.b=p1.b;p2.c=c;p2.step=p1.step+1;}else{p2.a=0;p2.b=p1.b;p2.c=p1.c+p1.a;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}if(p1.b!=0){if(p1.b>a-p1.a){p2.b=p1.b-(a-p1.a);p2.a=a;//注意这个a是容量为n的杯子p2.c=p1.c;p2.step=p1.step+1;}else{p2.b=0;p2.a=p1.a+p1.b;p2.c=p1.c;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}if(p1.b!=0){if(p1.b>c-p1.c){p2.b=p1.b-(c-p1.c);p2.a=p1.a;p2.c=c;p2.step=p1.step+1;}else{p2.b=0;p2.a=p1.a;p2.c=p1.c+p1.b;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}if(p1.c!=0){if(p1.c>a-p1.a){p2.c=p1.c-(a-p1.a);p2.a=a;p2.b=p1.b;p2.step=p1.step+1;}else{p2.c=0;p2.a=p1.a+p1.c;p2.b=p1.b;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}if(p1.c!=0){if(p1.c>b-p1.b){p2.c=p1.c-(b-p1.b);p2.a=p1.a;p2.b=b;p2.step=p1.step+1;}else{p2.c=0;p2.a=p1.a;p2.b=p1.b+p1.c;p2.step=p1.step+1;}if(!vist[p2.a][p2.b][p2.c]){vist[p2.a][p2.b][p2.c]=1;q.push(p2);}}}printf("NO\n");
}
int main()
{while(scanf("%d%d%d",&a,&b,&c)>0&&(a+b+c)){if(a%2==1){printf("NO\n");continue;}bfs();}return 0;
}
hdu1495非常可乐相关推荐
- 【HDU1495非常可乐】【POJ3414Pots】
HDU1495非常可乐 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和se ...
- HDU1495 非常可乐
问题链接:HDU1495 非常可乐. 题意简述:平分液体问题.输入s.n和m三个数,分别代表可乐和2个杯子,三个容器可以互相倒,问能不能把s中的可乐平分,能的话输出最小倒杯子的次数,不能就输出NO. ...
- HDU1495 非常可乐【倒水问题+BFS】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU1495 非常可乐 【BFS】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu1495 非常可乐(bfs)
Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且 ...
- CCF认证训练行动路线图
通过CCF认证的训练题选自三个方面,一是CCF认证试题,二是使用北大百练的练习题等等,三是ACM-ICPC的练习题. CCF认证的试题是必须练习的,通过CCF试题的练习有助于了解试题风格特点.然而CC ...
- TYUT-A专题题解(二)
TYUT-A专题题解(一) TYUT-A专题题解(二) 36暴力枚举 AOJ0008 Sum of 4 Integers[暴力]_海岛Blog-CSDN博客 HDU1407 测试你是否和LTC水平一样 ...
- HDU各种比赛题题解(一)
HDU各种比赛题题解(一) Gardon-DYGG Contest 1 HDU1178 Heritage from father[水题] - 海岛Blog - CSDN博客 HDU1181 变形课[D ...
- kuangbin 专题一 简单搜索
kuangbin 专题一 简单搜索 1.POJ1321棋盘问题[DFS] 代码 自己的想法 2.POJ2251Dungeon Master[三维空间BFS] 代码 自己的想法 3.POJ3278 Ca ...
最新文章
- python入门教程完整版(懂中文就能学会)-Python入门教程完整版400集(懂中文就能学会)快来带走...
- 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )
- 分库分表就能无限扩容吗,解释得太好了
- 百度搜索资源平台添加自己的网站
- boost::lexical_cast模块测试 Source 是否不可复制
- 《循序渐进学Spark》一1.6 使用Spark Shell开发运行Spark程序
- Testng生成的测试报告乱码解决办法
- linux下vi修改文件用法
- 软件项目组织管理(二、三)项目管理与信息技术环境、项目管理过程组
- angular js创建表单_如何优雅的使用 Angular 表单验证
- iphonex屏幕出现一条绿线_关于对 iPhone 11、iPhone X? 采用的 Liquid 视网膜显示屏的误区,在此说明。...
- 2019-06-04 Sublime Text 中文输入法的问题
- android高通WiFi,高通QCA9377 WiFi蓝牙模块芯片介绍,
- ipv4和计算机地址是什么意思,ipv6是什么意思?我们怎么查看电脑iPv6地址
- 人脸识别算法一:特征脸方法(Eigenface)
- java连接打印机并进行打印
- Java开发,需要学习什么内容?
- 什么是飞书机器人?如何定时发送飞书机器人消息?
- 制造行业实施作业成本法案例(AMT 邓为民)
- 图片转换成语音怎么弄?这几个方法教给你