中文题就不说题意了,思路就是bfs模拟倒可乐,因为有三个容器所以每次都有六个方向可以选择,代码虽然很长,但是六个过程就是复制粘贴,不小心在bfs的过程中,写错了一个变量,结果数组越界,直接re,找了老半天,果然代码写越长就越容易出现纰漏。
//#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct no{
int a,b,c,t;
}st;
int jud[110][110];
int ma,mi,bo;
int bfs(){
queue<no> q;
st.a=0;st.b=0;st.c=bo;st.t=0;
q.push(st);
jud[ma][mi]=1;
while(!q.empty()){
st=q.front();
no v;
if(st.a==bo/2&&st.c==bo/2){
return st.t;
}
if(st.a!=ma&&st.c){//瓶子倒大杯
int te=ma-st.a;
if(st.c>te){
v.a=ma;v.c=st.c-te;
}
else{
v.a=st.a+st.c;v.c=0;
}
v.b=st.b;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
if(st.b!=mi&&st.c){//瓶子倒小杯
int te=mi-st.b;
if(st.c>te){
v.b=mi;v.c=st.c-te;
}
else{
v.b=st.b+st.c;v.c=0;
}
v.a=st.a;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
if(st.a&&st.c!=bo){//大杯倒瓶子
int te=bo-st.c;
if(st.a>te){
v.c=bo;v.a=st.a-te;
}
else{
v.c=st.c+st.a;v.a=0;
}
v.b=st.b;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
if(st.a&&st.b!=mi){//大杯倒小杯
int te=mi-st.b;
if(st.a>te){
v.b=mi;v.a=st.a-te;
}
else{
v.b=st.b+st.a;v.a=0;
}
v.c=st.c;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
if(st.a!=ma&&st.b){//小杯倒大杯
int te=ma-st.a;
if(st.b>te){
v.a=ma;v.b=st.b-te;
}
else{
v.a=st.a+st.b;v.b=0;//在这里b写成了c,结果数组越界,提交的时候崩溃了
}
v.c=st.c;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
if(st.c!=bo&&st.b){//小杯倒瓶子
int te=bo-st.c;
if(st.b>te){
v.c=bo;v.b=st.b-te;
}
else{
v.c=st.b+st.c;v.b=0;
}
v.a=st.a;v.t=st.t+1;
if(!jud[v.a][v.b]){
q.push(v);
jud[v.a][v.b]=1;
}
}
q.pop();
}
return 0;
}
int main(){
while(scanf("%d%d%d",&bo,&ma,&mi)&&(ma||mi||bo)){
memset(jud,0,sizeof(jud));
if(ma<mi) swap(ma,mi);
if(bo%2) {
puts("NO");
continue;
}
int co=bfs();
if(co) printf("%d\n",co);
else puts("NO");
}
return 0;
}
\