一瓶可乐有s升,给你两个杯子容量分别为M和N升,问你是否可以用这两个杯子将可乐平分
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=101;
bool visited[maxn][maxn];
int m,n,s;
struct node
{
int x,y,all,t;
};
void bfs()
{
queue<node> que;
memset(visited,false,sizeof(visited));
node p,q;
p.x=p.y=p.t=0;
p.all=s;
que.push(p);
visited[p.x][p.y]=true;
while(!que.empty())
{
p=que.front();
que.pop();
if(p.y==p.all&&p.y==s/2)
{
printf("%d\n",p.t);
return ;
}
if(p.all+p.x>m)
{
q.x=m;
q.y=p.y;
q.all=p.all+p.x-m;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.x+p.all;
q.y=p.y;
q.all=0;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
if(p.all+p.y>n)
{
q.x=p.x;
q.y=n;
q.all=p.all+p.y-n;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.x;
q.y=p.y+p.all;
q.all=0;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
if(p.y+p.x>n)
{
q.x=p.x+p.y-n;
q.y=n;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=0;
q.y=p.y+p.x;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
q.x=0;
q.y=p.y;
q.all=p.all+p.x;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
if(p.y+p.x>m)
{
q.x=m;
q.y=p.y+p.x-m;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.x+p.y;
q.y=0;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
q.x=p.x;
q.y=0;
q.all=p.all+p.y;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
que.push(q);
visited[q.x][q.y]=true;
}
}
printf("NO\n");
}
int main()
{
while(~scanf("%d%d%d",&s,&m,&n))
{
if(m==0&&n==0&&s==0) break;
if(s%2)
{
printf("NO\n");
continue;
}
if(m>n) swap(m,n);
bfs();
}
return 0;
}