题目来源:https://vjudge.net/contest/159739#problem/M
【题意】
汉语意思不再解释。
【思路】
简单倒水问题,拥有三个杯子(一个瓶子),相互倒水,只有最后的状态是两只瓶子拥有一样的水,另一个瓶子没有,就可以了。
【代码】
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
int vs,va,vb;
bool vis[104][104][104];
struct pp
{
int s,a,b,t;
} q1,q2;
void bfs()
{
queue q;
q1.s=vs,q1.a=0,q1.b=0;
q1.t=0;
vis[vs][0][0]=1;
q.push(q1);
while(!q.empty())
{
q1=q.front();
q.pop();
if((!q1.s&&q1.a==q1.b)||(!q1.a&&q1.s==q1.b)||(!q1.b&&q1.a==q1.s))
{
printf("%d\n",q1.t);
return ;
}
for(int i=0; i<6; i++)
{
if(i==0)
{
q2=q1;
int v=q1.s+q1.a;
q2.a=v>va?va:v;
q2.s=v>va?(v-va):0;
}
else if(i==1)
{
q2=q1;
int v=q1.s+q1.a;
q2.s=v>vs?vs:v;
q2.a=v>vs?(v-vs):0;
}
else if(i==2)
{
q2=q1;
int v=q1.s+q1.b;
q2.b=v>vb?vb:v;
q2.s=v>vb?(v-vb):0;
}
else if(i==3)
{
q2=q1;
int v=q1.s+q1.b;
q2.s=v>vs?vs:v;
q2.b=v>vs?(v-vs):0;
}
else if(i==4)
{
q2=q1;
int v=q1.a+q1.b;
q2.a=v>vb?(v-vb):0;
q2.b=v>vb?vb:v;
}
else if(i==5)
{
q2=q1;
int v=q1.a+q1.b;
q2.a=v>va?va:v;
q2.b=v>va?(v-va):0;
}
if(!vis[q2.s][q2.a][q2.b])
{
q2.t++;
vis[q2.s][q2.a][q2.b]=1;
q.push(q2);
}
}
}
puts("NO");
}
int main()
{
while(~scanf("%d%d%d",&vs,&va,&vb))
{
if(!vs&&!va&&!vb)
break;
if(vs&1)
{
puts("NO");
continue;
}
mem(vis,0);
bfs();
}
}