#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iterator>
#include <list>
#include <stack>
#include <queue>
using namespace std;
/*
T3 杭电1495
*/
int s,n,m;
int vis[105][105][105];
struct cup
{
int s,n,m,step;
};
int check(int x,int y,int z)
{
if(x == 0 && y == z)
return 1;
if(y == 0 && x == z)
return 1;
if(z == 0 && x == y)
return 1;
return 0;
}
int bfs()
{
cup a,t;//a 为之前的杯子,t为之后杯子
queue<cup> q;
a.s=s;
a.n=0;
a.m=0;
a.step=0;
q.push(a);
vis[s][0][0]=1;//走过的不用在走一次
while(!q.empty())
{
a = q.front();
q.pop();
//检查是否平均
if(check(a.s,a.n,a.m))
return a.step;
/*
当s杯中有水
s -> n 1.能将n装满 ,2.不能将n装满
s -> m 1.能见m装满 ,2.不能将m装满
*/
if(a.s)
{
if(a.s>n-a.n)//s ->n 将 n装满
{
t = a;
t.s = t.s -(n-a.n);//之后的s杯子
t.n = n;//之后的n杯子 满
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else// s-> 装不满n
{
t = a;
t.n = t.s +t.n;//之后的n里有之前的s和之前的n
t.s = 0;//之后的s倒完了
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
if(a.s>m-a.m)//s ->m 将 m装满
{
t = a;
t.s = t.s -(m-a.m);//之后的s杯子
t.m = m;//之后的m杯子 满
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else// s-> 装不满m
{
t = a;
t.m = t.s +t.m;//之后的n里有之前的s和之前的m
t.s = 0;//之后的s倒完了
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
}
/*
当n杯中有水
n -> s 1.能将s装满 ,2.不能将s装满
n -> m 1.能见m装满 ,2.不能将m装满
与上同理
*/
if(a.n)
{
if(a.n>s-a.s)
{
t = a;
t.n = t.n -(s-a.s);
t.s = s;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else
{
t = a;
t.s = t.s +t.n;
t.n = 0;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
if(a.n>m-a.m)
{
t = a;
t.n = t.n -(m-a.m);
t.m = m;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else
{
t = a;
t.m = t.n +t.m;
t.n = 0;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
}
/*
当m杯中有水
m -> s 1.能将s装满 ,2.不能将s装满
m -> n 1.能见n装满 ,2.不能将n装满
与上同理
*/
if(a.m)
{
if(a.m>s-a.s)
{
t = a;
t.m = t.m -(s-a.s);
t.s = s;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else
{
t = a;
t.s = t.s +t.m;
t.m = 0;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
if(a.m>n-a.n)
{
t = a;
t.m = t.m -(n-a.n);
t.n = n;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
else
{
t = a;
t.n = t.n +t.m;
t.m = 0;
if(!vis[t.s][t.n][t.m])
{
t.step= a.step +1;
q.push(t);
vis[t.s][t.n][t.m]= 1;
}
}
}
}
return 0;
}
int main()
{
int result;
while(cin>>s>>n>>m ,s || n || m)
{
if(s%2)//奇数无法平分
{
cout<<"NO"<<endl;continue;
}
memset(vis,0,sizeof(vis));
result = bfs();
if (result)
cout<<result<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
图论 BFS HDU 1495
最新推荐文章于 2019-07-24 18:21:18 发布