您的位置:首页 > 其它

非常可乐 hdu 1495 BFS

2014-01-22 15:34 399 查看


非常可乐

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3977    Accepted Submission(s): 1634


Problem Description

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

 

Input

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

 

Output

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

 

Sample Input

7 4 3
4 1 3
0 0 0

 

Sample Output

NO
3

 

Author

seeyou

 

Source

“2006校园文化活动月”之“校庆杯”大学生程序设计竞赛暨杭州电子科技大学第四届大学生程序设计竞赛

 

Recommend

LL

这个题目还是很经典的,为什么用BFS可以求出这个最小解呢?稍稍解释一下,这三个瓶子其实不管怎么倒发,a,b,c三个瓶子不外乎6种选:a有剩余,从a倒入b,或者
从a倒入c; b有剩余,从b往a,从b往c; c有剩余,从c往a,从c往b;这样就是了
用BFS相当于只倒一次,却把所有的情况都列举了一遍,所以用BFS肯定有一种是首先完成要求的,这就是BFS的本质,哎,自己比较水,到今日方才明白广搜的本质啊

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define M 120
using namespace std;
struct node
{
int x,y,z;
int step;
};
int visit[M][M][M];
int judge(node p)
{
if(((p.x==p.y)&&(p.z==0))||((p.x==p.z)&&(p.y==0))||((p.y==p.z)&&(p.x==0)))
return 1;
return 0;

}
int BFS(int a,int b,int c)
{

queue<node> q;
node s,temp;
s.x=a;
s.y=0;
s.z=0;
s.step=0;
q.push(s);

visit[a][0][0]=1;
int num;
while(!q.empty())
{

temp=q.front();
//printf("%d  %d  %d  %d\n",temp.x,temp.y,temp.z,temp.step);
q.pop();
if(judge(temp))
{
//printf("aaa");
//printf("%d  %d  %d  %d\n",temp.x,temp.y,temp.z,temp.step);
return temp.step;
}
if(temp.x > 0)
{
if(temp.y < b)//x-->y
{
num = b - temp.y;//表示b中还差多少装满
s.z = temp.z;
s.step = temp.step + 1;
if(temp.x > num)
{
s.x = temp.x - num;
s.y = b;
}
else
{
s.x = 0;
s.y = temp.x + temp.y;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
if(temp.z < c)//x-->z
{
num = c - temp.z;
s.y = temp.y;
s.step = temp.step + 1;
if(temp.x > num)
{
s.x = temp.x - num;
s.z = c;
}
else
{
s.x = 0;
s.z = temp.x + temp.z;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
}
if(temp.y > 0)
{
if(temp.x < a)//y-->x
{
num = a - temp.x;
s.z = temp.z;
s.step = temp.step + 1;
if(temp.y > num)
{
s.y = temp.y - num;
s.x = a;
}
else
{
s.y = 0;
s.x = temp.y + temp.x;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
if(temp.z < c)//y-->z
{
num = c - temp.z;
s.x = temp.x;
s.step = temp.step + 1;
if(temp.y > num)
{
s.y = temp.y - num;
s.z = c;
}
else
{
s.y = 0;
s.z = temp.y + temp.z;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
}
if(temp.z > 0)
{
if(temp.x < a)//z-->x
{
num = a - temp.x;
s.y = temp.y;
s.step = temp.step + 1;
if(temp.z > num)
{
s.z = temp.z - num;
s.x = a;
}
else
{
s.z = 0;
s.x = temp.x + temp.z;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
if(temp.y < b)//z-->y
{
num = b - temp.y;
s.x = temp.x;
s.step = temp.step + 1;
if(temp.z > num)
{
s.z = temp.z - num;
s.y = b;
}
else
{
s.z = 0;
s.y = temp.y + temp.z;
}
if(!visit[s.x][s.y][s.z])
{
visit[s.x][s.y][s.z] = 1;
q.push(s);
}
}
}

}
return 0;
}
int main()
{
int s,n,m;
while(scanf("%d%d%d",&s,&n,&m)!=EOF)
{

if((s==0)&&(n==0)&&(m==0))
break;
if(s%2==1)
{
printf("NO\n");

continue;
}
memset(visit,0,sizeof(visit));
int ans=BFS(s,n,m);
// printf("fdshjkf");
if(ans)
printf("%d\n",ans);
else
printf("NO\n");
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BFS