需要注意几个点,由a向b倒水时,要考虑a中水为0的情况;如果定义队列为全局变量,需要在初始化时对队列进行清空;如果s为奇数,则不能实现平分,直接输出no
#include <iostream>
#include <cstring>
#include <queue>
#define maxn 101
using namespace std;
int visit[maxn][maxn];
int s, n, m;
struct node{
int x, y, z;
int step;
void operator = (node &t){
x = t.x;
y = t.y;
z = t.z;
step = t.step;
}
};
queue<node> bufq;
int judge(node &t){
if(t.x == s/2 && t.y == s/2) return 1;
if(t.x == s/2 && t.z == s/2) return 1;
if(t.y == s/2 && t.z == s/2) return 1;
return 0;
}
int bfs(){
memset(visit, 0, sizeof(visit));
while(!bufq.empty()) bufq.pop();
node tmp;
tmp.x = s; tmp.y = 0; tmp.z = 0; tmp.step = 0; visit[0][0] = 1;
bufq.push(tmp);
while(!bufq.empty()){
tmp = bufq.front();
bufq.pop();
if(judge(tmp)){
cout<<tmp.step<<endl;
return 1;
}
++tmp.step;
node t = tmp;
// cout<<t.x<<t.y<<t.z<<endl;
if(tmp.x + tmp.y <= m){
tmp.y += tmp.x;
tmp.x = 0;
}
else{
tmp.x -= m - tmp.y;
tmp.y = m;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
tmp = t;
if(tmp.x + tmp.y <= s){
tmp.x += tmp.y;
tmp.y = 0;
}
else{
tmp.y -= s - tmp.x;
tmp.x = s;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
tmp = t;
if(tmp.x + tmp.z <= n){
tmp.z += tmp.x;
tmp.x = 0;
}
else{
tmp.x -= n - tmp.z;
tmp.z = n;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
tmp = t;
if(tmp.x + tmp.z <= s){
tmp.x += tmp.z;
tmp.z = 0;
}
else{
tmp.z -= s - tmp.x;
tmp.x = s;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
tmp = t;
if(tmp.y + tmp.z <= n){
tmp.z += tmp.y;
tmp.y = 0;
}
else{
tmp.y -= n - tmp.z;
tmp.z = n;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
tmp = t;
if(tmp.z + tmp.y <= m){
tmp.y += tmp.z;
tmp.z = 0;
}
else{
tmp.z -= m - tmp.y;
tmp.y = m;
}
if(!visit[tmp.y][tmp.z]){
bufq.push(tmp);
visit[tmp.y][tmp.z] = 1;
}
}
return 0;
}
int main(){
while(cin>>s>>n>>m){
if(s == 0 && n == 0 && m == 0)
break;
if(s%2 ||!bfs()) cout<<"NO"<<endl;
}
return 0;
}