http://acm.hdu.edu.cn/showproblem.php?pid=1495
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
分为6种情况搜索,小->大,小->总,大->总,总->大,总->小,大->小;记录最小步数
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
int all,small,big,num;
};
int all,big,small;
bool visit[101][101];
int bfs()
{int count;
memset(visit,0,sizeof(visit));
queue<node>q;
node s,g;
s.all=all;s.small=0;s.big=0;s.num=0;
visit[s.big][s.small]=1;
q.push(s);
while(!q.empty())
{
s=q.front();
q.pop();
count=0;
if(s.all==all/2) count++;
if(s.big==all/2) count++;
if(s.small==all/2) count++;
if(count==2)
return s.num;
if(s.all)
{
g=s;
if(g.big<big)//all->big
{
if(g.big+g.all>big)
{
g.all-=(big-g.big);
g.big=big;
}
else
{
g.big+=g.all;
g.all=0;
}
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
g=s;
if(g.small<small)//all->small
{
if(g.small+g.all>small)
{
g.all-=(small-g.small);
g.small=small;
}
else
{
g.small+=g.all;
g.all=0;
}
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
}
/////////////////////
if(s.big)
{
g=s;
if(g.small<small)//big->small
{
if(g.small+g.big>small)
{
g.big-=(small-g.small);
g.small=small;
}
else
{
g.small+=g.big;
g.big=0;
}
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
g=s;//small->big
g.all+=g.big;
g.big=0;
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
///////////////////
if(s.small)
{
g=s;
if(g.big<big)//small->big
{
if(g.big+g.small>big)
{
g.small-=(big-g.big);
g.big=big;
}
else
{
g.big+=g.small;
g.small=0;
}
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
g=s;
g.all+=g.small;//small->all
g.small=0;
g.num++;
if(!visit[g.big][g.small])
{
visit[g.big][g.small]=1;
q.push(g);
}
}
}
return 0;
}
int main()
{
int ans,temp;
while(scanf("%d%d%d",&all,&small,&big)!=EOF&&big+small+all!=0)
{
if(small>big)
{
temp=small;
small=big;
big=temp;
}
if(all%2==1)
ans=0;
else
ans=bfs();
if(ans)
printf("%d\n",ans);
else
printf("NO\n");
}
return 0;
}