非常可乐---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 ...
随机推荐
- Web暴力破解--前端JS表单加密进行爆破
0x01 前言 常见的js实现加密的方式有:md5.base64.shal,写了一个简单的demo作为测试. 0x02 代码 login.html <!DOCTYPE HTML> < ...
- Myeclipse10使用git
用Myeclipse安装egit,使用官网最新地址或者下载最新的egit插件到本地安装均在team中看不到git,最后发现到http://download.eclipse.org/egit/updat ...
- 【llinux】yum命令出现Loaded plugins: fastestmirror Determining fastest mirrors
在进行yum 安装的时候.报错了. Loaded plugins: fastestmirror Determining fastest mirrors fastestmirror是yum的一个加速插件 ...
- cxGrid数据录入
一.数据录入 1 在TcxGridDBTableView中,设定属性 NewItemRow.Visible = True 2 在cxgrid中输入数据怎样回车换行 在TcxGridDBTableV ...
- MFC 刷新函数:Invaldate,UpdateWindow,InvaldateRect
在窗口刷新和绘制的过程中,常常需要用到窗口刷新函数.一般用于窗口图形刷新的函数有:UpdateWindows().Invaldate().InvaldateRect(). 先说UpdateWindow ...
- GOOGLE CODE ANDROID 开源项目 集合
转:http://blog.csdn.net/dellheng/article/details/7163333 1. ZXing http://code.google.com/p/zx ...
- List的五种去重方式
//set集合去重,不改变原有的顺序 public static void pastLeep1(List<String> list){ System.out.println("l ...
- Git 多人协作开发的过程
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- java(6) ArrayList源码
系统环境: JDK 1.7 成员变量 //默认的初始化数组大小 private static final int DEFAULT_CAPACITY = 10; //空的对象数组 private sta ...
- tornado 数据库操作
tornado是python的web框架,web程序开发中数据库操作是必须的. 安装: tornado的官方文档中提供的说明比较少,而且提供的模块中未找到数据库方面的模块,难道没有针对数据库操作进行封 ...