此题需要注意的是。最后的判断条件应是。。S == M + N ..
刚开始把判断条件搞错了。认为只要任意两杯相加与第三杯相等即可。。
悲剧啊。改了我一个多时侯。改来改去还是测试数据还是2.。。
最后把测试数据手算下才知道。。
判断条件写错了。。
代码写得有点差。。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
using namespace std;
int S, N, M, t;
struct node
{
int s, n, m, t;
bool operator < (const node &A) const
{
return A.t < t;
}
}NODE;
int c1[120];
int c2[120];
int c3[120];
int main( )
{
while (scanf("%d%d%d", &S, &N, &M) , S || N || M)
{
int r, s1, n1, m1, f1 = 0, n, m, s, t, t1;
memset(c1, 0, sizeof(c1));
memset(c2, 0, sizeof(c2));
memset(c3, 0, sizeof(c3));
priority_queue<node>q;
NODE.s = S, NODE.t = 0, NODE.m = 0, NODE.n = 0;
q.push(NODE);
c1[S] = 1, c2[0] = 1, c3[0] = 1;
while ( !q.empty( ))
{
NODE = q.top( );
q.pop( );
s = NODE.s, t = NODE.t;
m = NODE.m, n = NODE.n;
if( ( s == m + n ) )
{
f1 = 1;
printf("%d\n",t);
break;
}
//对大杯子的操作,倒在M里
if(s > 0)
{
if ( (s - (M - m) ) >= 0)
m1 = M, s1 = s - (M - m);
else
m1 = s + m, s1 = 0;
n1 = n;
NODE.s = s1, NODE.t = t + 1, NODE.m = m1, NODE.n = n1;
if ( s1 >= 0 && m1 <= M && n1 <= N && (!c1[s1] || !c2[m1] || !c3[n1]) )
{
c1[s1] = c2[m1] = c3[n1] = 1;
q.push(NODE);
// printf("1:(%d ,%d, %d)->%d\n",s1, n1, m1, t + 1);
}
}
//对大杯子的操作,倒在N里
if(s > 0)
{
if ( (s - (N - n) ) >= 0 )
s1 = s- (N - n), n1 = N;
else
s1 = 0, n1 = n + s;
m1 = m;
NODE.s = s1, NODE.t = t + 1, NODE.n = n1, NODE.m = m1;
if ( s1 >= 0 && m <= M && n1 <= N && (!c1[s1] || !c2[m1] || !c3[n1] ) )
{
c1[s1] = 1;
c2[m1] = 1;
c3[n1] = 1;
q.push(NODE);
// printf("2:(%d ,%d, %d)->%d\n",s1, n1, m1, t + 1);
}
}
//对N的操作,倒在S大杯子里
if(n > 0)
{
if (n <= (S- s) )
n1 = 0, s1 = s + n;
else
n1 = n - (S -s), s1 = S;
m1 = m;
NODE.s = s1, NODE.t = t + 1, NODE.n = n1, NODE.m = m1;
if ( s1 >= 0 && m <= M && n1 <= N && (!c1[s1] || !c2[m1] || !c3[n1] ))
{
c1[s1] = 1;
c2[m1] = 1;
c3[n1] = 1;
q.push(NODE);
// printf("3:(%d ,%d, %d)->%d\n",s1, n1, m1, t + 1);
}
}
//对N的操作,倒在M杯子里
if( n > 0)
{
if (n <= (M- m) )
n1 = 0, m1 = m + n;
else
n1 = n - (M -m), m1 = M;
NODE.m = m1, NODE.t = t + 1, NODE.n = n1;
NODE.s = s;
if ( s >= 0 && m1 <= M && n1 <= N && (!c1[s] || !c2[m1] || !c3[n1])) {
c1[s] = 1;
c2[m1] = 1;
c3[n1] = 1;
q.push(NODE);
//printf("4:(%d ,%d, %d)->%d\n",s, n1, m1, t + 1);
}
}
//对M的操作,倒在S杯子里
if( m > 0)
{
if (m <= (S- s) )
m1 = 0, s1 = s + m;
else
m1 = m - (S -s), s1 = S;
NODE.m = m1, NODE.t = t + 1, NODE.s = s1, NODE.n = n;
if ( s1 >= 0 && m1 <= M && n <= N && !c1[s1] || !c2[m1] || !c3[n])
{
c1[s1] = 1;
c2[m1] = 1;
c3[n] = 1;
q.push(NODE);
// printf("5:(%d ,%d, %d)->%d\n",s1, n1, m1, t);
}
}
//对M的操作,倒在N杯子里杯子里
if( m > 0 )
{
if (m <= (N-n) )
m1 = 0, n1 = n + m;
else
m1 = m - (N -n), n1 = N;
NODE.m = m1, NODE.t = t + 1, NODE.n = n1;
NODE.s=s;
if ( s >= 0 && m1 <= M && n1 <= N && !c1[s] || !c2[m1] || !c3[n1])
{
c1[s] = 1;
c2[m1] = 1;
c3[n1] = 1;
q.push(NODE);
// printf("6:(%d ,%d, %d)->%d\n",s, n1, m1, t + 1);
}
}
}
if (!f1)
puts("NO");
}
return 0;
}