HDU1495(bfs)
非常可乐
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10349 Accepted Submission(s):
4143
毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且
S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
const int MAX=105;
int s,n,m;
struct node{
int s,n,m,t;
};
int vis[MAX][MAX][MAX];
int bfs(){
node now,next;
queue<node>q;
while(!q.empty())
q.pop();
now.s=s;now.n=now.m=now.t=0;
memset(vis,0,sizeof(vis));
vis[s][0][0]=1;
q.push(now);
while(!q.empty()){
now=q.front(),q.pop();
if((now.n==now.m&&now.s==0)||(now.n==now.s&&now.m==0)||(now.s==now.m&&now.n==0))
return now.t;
int tmp;
if( now.s!=0 ){
if( now.n!=n ){
tmp=min( now.s,n-now.n );
next=now;
next.t=now.t+1;
next.s-=tmp;
next.n+=tmp;
if( vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/ ){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push(next);
}
}
if( now.m!=m ){
tmp=min( now.s,m-now.m );
next=now;
next.t=now.t+1;
next.s-=tmp;
next.m+=tmp;
if( vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/ ){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push( next );
}
}
}// 1 to (2 or 3)
if(now.n!=0){
tmp=now.n;
next=now;
next.t=now.t+1;
next.s+=tmp;
next.n=0;
if( vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/ ){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push( next );
}
if( now.m!=m ){
tmp=min(m-now.m,now.n);
next=now;
next.t=now.t+1;
next.m+=tmp;
next.n-=tmp;
if(vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push( next );
}
}
}//2 to( 1 or 3 )
if( now.m!=0 ){
tmp=now.m;
next=now;
next.t=now.t+1;
next.m=0;
next.s+=tmp;
if( vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/ ){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push( next );
}
if( now.n!=n ){
tmp=min( n-now.n,now.m );
next=now;
next.t=now.t+1;
next.n+=tmp;
next.m-=tmp;
if( vis[next.s][next.n][next.m]==0/*vis[ next ]==0*/ ){
vis[next.s][next.n][next.m]=1;//vis[ next ]=1;
q.push( next );
}
}
}
}
return -1;
}
int main(){
while( scanf("%d%d%d",&s,&n,&m),s+n+m )
{
if( s%2==1 ){
printf("NO\n");
continue;
}
if( n==m ){
printf("1\n");
continue;
}
int ans=bfs();
if( ans!=-1 )
printf("%d\n",ans);
else
printf("NO\n");
}
return 0;
}
这是一个经典的广搜题,开始我是用java编写的,但是总是写不对,后来询问了一下老师,老师说要拷贝now里面的数据再去倒;这个地方有几个小细节大家应该要注意。这里基本上采用了暴力列举,把六种情况列举了出来。先是从1倒到或2,把他们倒满,再是从2倒到3或者是1把2的中的水倒完。3倒到1或者2,把3中的水倒完;
HDU1495(bfs)的更多相关文章
- hdu1495 bfs搜索、模拟
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...
- HDU-1495 非常可乐(BFS)
广搜的灵活应用题: 非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu1495(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题意:有三个杯子,开始时第一个杯子装满水(体积为a),倒来倒去,得到其中2个杯里的水的体积都为a ...
- 非常可乐(杭电hdu1495)bfs
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- hdu1495(经典bfs,平分水问题)
思路:搜索题,第一次做这种类型的题目吧,一开始表示不怎么明白题意所说的东东.其实就是要你判断可乐能不能被平分........ 有六种状态,从a瓶到b瓶,a-->c b-->a b- ...
- HDU1495 非常可乐 —— BFS + 模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 非常可乐 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU1495 非常可乐(BFS/数论)
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...
- hdu1495 倒水bfs
题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1495/ 题意:给定三个杯子S,M,N,满足S=M+N,现在要求用最短的次数将S杯中的饮倒平分到两个杯子中.我们首 ...
- poj3414(bfs)
题目链接:http://poj.org/problem?id=3414 题意:给你两个容器 A B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作.如果不能 ...
随机推荐
- velocity-1.7中vm文件的存放位置
velocity-1.7中关于vm文件存放 demo: public class App_example1 { public App_example1() { String propfile=&quo ...
- vc:如何从Internet上有效而稳定地下载文件
http://www.vckbase.com/index.php/wv/172 如何从Internet上有效而稳定地下载文件 ,这是很多网络应用程序要考虑的重要问题,本文提供的代码段针对这个问题进行了 ...
- Dom4j的使用(全而好的文章)
版权声明: 本文由冰云完成,首发于CSDN,未经许可,不得使用于任何商业用途. 文中代码部分引用自DOM4J文档. 欢迎转载,但请保持文章及版权声明完整. 如需联络请发邮件:icecloud( ...
- WPF——传实体类
User u; private void Button_Click_1(object sender, RoutedEventArgs e) //点击登陆按钮,弹出新窗体 { //先判断一下是不是正确的 ...
- C# GC.Collect()
用C#写了一个运用ICE组件进行接口通信的服务程序,程序运行很正常,可是在客户端调用ICE接口时出现了大量的数据丢失,而且偶尔还通信不上,服务端最明显的现象就是telnet服务的通信端口时不通(cmd ...
- wuzhicms 发送邮件
发送邮件 //邮件发送 $config = get_cache('sendmail'); $siteconfigs = get_cache('siteconfigs'); $password = de ...
- HDU 2509
与HDU 1907一样... #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...
- Xmind Pro 3.4.0.201311050558 Xmind 3.4 破解版 Crack
其实就一个附件.某大神那里的下不到了.从这里就好了. 使用方法请参见压缩包~ 如果连接不能用了请及时告知回复.>< 仅适用于与版本号为201311050558的Xmind.当然尊重正版开发 ...
- HW2.8
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- POJ3280 - Cheapest Palindrome(区间DP)
题目大意 给定一个字符串,要求你通过插入和删除操作把它变为回文串,对于每个字符的插入和删除都有一个花费,问你把字符串变为回文串最少需要多少花费 题解 看懂题立马YY了个方程,敲完就交了,然后就A了,爽 ...