大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
Input:
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
Output:
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
Sample Input:
7 4 3
4 1 3
0 0 0
Sample Output:
NO
3
这个题吧,就是把六种情况进行模拟知道得到结果,当然也可能没有结果。
六种情况:
从S倒cola到N,从S倒colaM,从N倒cola到M,从M倒cola到N,从N倒cola到S,从M倒cola到S。
关键是用一个二维或三维(推荐二维)数组去记录状态,否则很容易超内存。
废话不多说,上代码:
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
int S,N,M;
struct D
{
int TM,TS,TN,t;
};
bool book[105][105]; //标记状态
int BFS()
{
queue<D>Q;
D first;
first.TS = S,first.TN = 0,first.TM = 0,first.t = 0;
Q.push(first);
while(!Q.empty())
{
D mid = Q.front();
if(mid.TS == mid.TN && mid.TM == 0)
{
return mid.t;
}
Q.pop();
if(mid.TN<N) //S->N
{
D midd = mid;
if(mid.TS>N-mid.TN)
{
midd.TS -= N-midd.TN;
midd.TN = N;
midd.t++;
if(book[midd.TN][midd.TM] == false)//判断,如果没出现过再往下
{
Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
}
if(mid.TM<M) //S->M
{
D midd = mid;
if(mid.TS>M-mid.TM)
{
midd.TS -= M-midd.TM;
midd.TM = M;
midd.t++;
if(book[midd.TN][midd.TM] == false)
{
Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
}
if(mid.TN) //N->S
{
D midd = mid;
midd.TS += midd.TN;
midd.TN = 0;
midd.t++;
if(book[midd.TN][midd.TM] == false)
{
Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
if(mid.TM) //M->S
{
D midd = mid;
midd.TS += midd.TM;
midd.TM = 0;
midd.t++;
if(book[midd.TN][midd.TM] == false)
{
Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
if(mid.TM<M && mid.TN) //N->M
{
D midd = mid;
if(midd.TN>=M-midd.TM)
{
midd.TN -= M-midd.TM;
midd.TM = M;
}
else
{
midd.TM += midd.TN;
midd.TN = 0;
}
midd.t++;
if(book[midd.TN][midd.TM] == false)
{
Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
if(mid.TN<N && mid.TM) //M->N
{
D midd = mid;
if(midd.TM>=N-midd.TN)
{
midd.TM -= N-midd.TN;
midd.TN = N;
}
else
{
midd.TN += midd.TM;
midd.TM = 0;
}
midd.t++;
if(book[midd.TN][midd.TM] == false)Q.push(midd);
book[midd.TN][midd.TM] = true;
}
}
return -1;//没有返回-1
}
int main()
{
while(scanf("%d %d %d",&S,&N,&M) && S|N|M)
{
if(S&1)//S是奇数就过。
{
printf("NO
");
continue;
}
memset(book,false,sizeof(book));
book[0][0] = true;
if(M>N)
{
int mid = N;
N = M;
M = mid;
}
int T = BFS();
if(T == -1)printf("NO
");
else printf("%d
",T);
}
return 0;
}