非常可乐 hdu 1495

此题需要注意的是。最后的判断条件应是。。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;
}




posted on 2011-08-09 16:38  more think, more gains  阅读(279)  评论(0编辑  收藏  举报

导航