题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21
思路:一共分12种情况 举个例子 A -> C倒水的时候,可能把C装满,可能不满。这就是两种情况
所有的情况 A -> B (B可能满,可能不满)
A -> C
B -> A
B -> C
C -> A
C -> B
然后逐个搜索一遍就好了。。
代码:
#include <cstdio>
#include <cstring>
typedef struct node
{
int x,y,z;
int step;
} node;
node que[1000];
const int max_v = 100;
int v[max_v][max_v][max_v];
int v1,v2,v3;
int e1,e2,e3;
int flag;
void bfs()
{
int head,tail;
node t;
t.x = v1;
t.y = 0;
t.z = 0;
t.step = 0;
head = tail = 0;
que[tail++] = t;
while(head < tail)
{
node t1;
t = que[head++];
// printf("%d %d %d\n",t.x,t.y,t.z);
if(t.x == e1 && t.y == e2 && t.z == e3)
{
printf("%d\n",t.step);
flag = true;
return ;
}
if(t.x > v2 - t.y ) // a -> b
{
t1.x = t.x - (v2 - t.y);
t1.y = v2;
t1.z = t.z;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.x <= v2 - t.y ) // a -> b
{
t1.x = 0;
t1.y = t.y + t.x;
t1.z = t.z;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.x > v3 - t.z) // a -> c
{
t1.x = t.x - (v3 - t.z);
t1.y = t.y;
t1.z = v3;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.x <= v3 - t.z) // a -> c
{
t1.x = 0;
t1.y = t.y;
t1.z = t.z + t.x;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.y > v1 - t.x) // b -> a
{
t1.x = v1;
t1.y = t.y - (v1 - t.x);
t1.z = t.z;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.y <= v1 - t.x) // b -> a
{
t1.x = t.x + t.y;
t1.y = 0;
t1.z = t.z;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.y > v3 - t.z) // b -> c
{
t1.x = t.x;
t1.y = t.y - (v3 - t.z);
t1.z = v3;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.y <= v3 - t.z) // b -> c
{
t1.x = t.x;
t1.y = 0;
t1.z = t.z + t.y;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.z > v1 - t.x) //c -> a
{
t1.x = v1;
t1.y = t.y;
t1.z = t.z - (v1 - t.x);
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.z <= v1 - t.x) //c -> a
{
t1.x = t.x + t.z;
t1.y = t.y;
t1.z = 0;
t1.step = t.step + 1;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.z > v2 - t.y) // c -> b
{
t1.x = t.x;
t1.y = v2;
t1.z = t.z - (v2 - t.y);
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
if(t.z <= v2 - t.y) // c -> b
{
t1.x = t.x;
t1.y = t.y + t.z;
t1.z = 0;
if(!v[t1.x][t1.y][t1.z])
{
que[tail++] = t1;
v[t1.x][t1.y][t1.z] = 1;
}
}
}
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
scanf("%d%d%d",&v1,&v2,&v3);
scanf("%d%d%d",&e1,&e2,&e3);
//printf("%d %d %d\n%d %d %d\n",v1,v2,v3,e1,e2,e3);
flag = false;
memset(v,0,sizeof(v));
v[v1][0][0] = 1;
bfs();
if(!flag)
printf("-1\n");
}
return 0;
}