【BFS】HDU 1495
题意:中文题,不解释。
思路:三个杯子倒来倒去,最后能让其中两个平分即可。可能性六种。判定的时候注意第三个杯子不能有水,倒的时候也要注意别超过了倒进去的杯子的容积。
a->b || a->c || b->a || b->c || c->a || c->b
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int vis[105][105][105];
struct node{
int s,n,m;
int step;
};
bool check(int S,int N,int M){
if(S==0&&(N==M))
return true;
if(N==0&&(S==M))
return true;
if(M==0&&(S==N))
return true;
return false;
}
int bfs(int S,int M,int N){
queue<node>Q;
node P,T;
P.s = S;
P.m = 0;
P.n = 0;
P.step = 0;
vis[S][0][0] = 1;
Q.push(P);
while(Q.size()){
P = Q.front();
Q.pop();
if(check(P.s,P.m,P.n)){
return P.step;
}
if(P.s){
if(P.s>N-P.n){
T.s = P.s-(N-P.n);
T.n = N;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.s = 0;
T.n = P.s+P.n;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.s>M-P.m){
T.s = P.s-(M-P.m);
T.m = M;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.s = 0;
T.m = P.s+P.m;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
if(P.m){
if(P.m>N-P.n){
T.m = P.m-(N-P.n);
T.n = N;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.m = 0;
T.n = P.n+P.m;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.m>S-P.s){
T.m = P.m-(S-P.s);
T.s = S;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.m = 0;
T.s = P.s+P.m;
T.n = P.n;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
if(P.n){
if(P.n>S-P.s){
T.n = P.n-(S-P.s);
T.s = S;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.n = 0;
T.s = P.s+P.n;
T.m = P.m;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
if(P.n>M-P.m){
T.n = P.n-(M-P.m);
T.m = M;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
else{
T.n = 0;
T.m = P.m+P.n;
T.s = P.s;
if(!vis[T.s][T.n][T.m]){
T.step=P.step+1;
Q.push(T);
vis[T.s][T.n][T.m] = 1;
}
}
}
}
return -1;
}
int main(){
int S,M,N;
while(~scanf("%d%d%d",&S,&N,&M)){
if(S==0&&N==0&&M==0){
break;
}
if(S%2){
printf("NO\n");
continue;
}
memset(vis,0,sizeof(vis));
int ans = bfs(S,M,N);
if(ans==-1) printf("NO\n");
else printf("%d\n",ans);
}
return 0;
}
【BFS】HDU 1495的更多相关文章
- 【BFS】hdu 1973 Prime Path
题目描述: http://poj.org/problem?id=3414 中文大意: 使用两个锅,盛取定量水. 两个锅的容量和目标水量由用户输入. 允许的操作有:灌满锅.倒光锅内的水.一个锅中的水倒入 ...
- 【题解】HDU Homework(倍增)
[题解]HDU Homework(倍增) 矩阵题一定要多多检查一下是否行列反了... 一百个递推项一定要存101个 说多了都是泪啊 一下午就做了这一道题因为实在是太菜了太久没写这种矩阵的题目... 设 ...
- 【BFS】POJ 3414
直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...
- 【动态规划】HDU 5492 Find a path (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5492 题目大意: 一个N*M的矩阵,一个人从(1,1)走到(N,M),每次只能向下或向右走.求(N+ ...
- 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...
- 【动态规划】HDU 5781 ATM Mechine
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5781 题目大意: 一个人有[0,K]内随机的钱,每次可以随意取,但是不知道什么时候取完,取钱超过剩余 ...
- 【贪心】HDU 5783 Divide the Sequence
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 题目大意: 把一个N个数的数列拆成若干段,保证每一段的前缀和都非负,求最多能拆成多少段. 题目 ...
- 【动态规划】HDU 5791 Two
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...
- 【动态规划】【KMP】HDU 5763 Another Meaning
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...
随机推荐
- Maximal Rectangle
很不好想的一道题,参考:http://blog.csdn.net/doc_sgl/article/details/11832965 分为两步:把原矩阵转为直方图,再用largest rectangle ...
- iOS web remote debug 正确的姿势
在使用iOS Remote debug需要做以下准备 1. iOS devices 开启java script and web inspector 开启方式如下: 2. mac OS 自带的Safar ...
- jdbcTemplate批量插入(添加)
public void addSubscibe(List<PermedipUserSubscribeVo> list) { final List<PermedipUserSubscr ...
- HSSFWorkBooK用法
public ActionResult excelPrint() { HSSFWorkbook workbook = new HSSFWorkbook();// 创建一个Excel文件 HSSFShe ...
- 编译器警告:CGContextSaveGState: invalid context 0x0
一.问题描述 下载图片,然后用Quartz2D绘制缩放的图片,运行无法显示图片并且编译器警告: Aug 18 21:41:50 02_计算UITableViewCell的行高[16777] < ...
- C++ 字符处理函数
C/C++里有一个头文件#include <ctype.h>,里面定义了很多字符函数,在实际开发中,用起来很方面. int isalpha(int ch) 若ch是字母('A'-'Z', ...
- quertz 使用小例
最近工作中用了个任务调度,学的不好,就把它记下来,为了以后参考 一般的 quartz都允许有一个名为quartz.properties的配置文件,通过它可以修改quartz框架运行时的环境: Quar ...
- Jquery-zTree的用法
[部分函数和属性介绍] 核心:zTree(setting, [zTreeNodes]) 这个函数接受一个JSON格式的数据对象setting和一个JSON格式的数据对象zTreeNodes,从而建立 ...
- AspNetPager分页控件的使用
下面所记得东西仅仅是使用方法,详细知识点请看链接:http://www.webdiyer.com/Controls/AspNetPager/Downloads 首先:从网站上下载并安装控件 下载地址: ...
- C#调用win32 api 操作其它窗口
实现以下功能: 找到窗体 找到控件(也叫子窗体) 获取内容 获取位置 设置 位置 内容 鼠标点击 示范 1. 找窗体 以操作系统自带的计算器为例 string clWindow = "Cal ...