裸的广搜,总共有6个状态,V1-->V2,V1-->V3,V2-->V1,V2-->V3,V3-->V1,V3-->V2.
代码如下:
001.
#include<stdio.h>
002.
#include<string.h>
003.
#include<queue>
004.
#include<algorithm>
005.
using
namespace
std;
006.
007.
int
V1,V2,V3,E1,E2,E3;
008.
009.
struct
state
010.
{
011.
int
a,b,c,step;
012.
}s1,s3;
013.
int
visited[102][102][102];
014.
void
bfs()
015.
{
016.
memset
(visited,0,
sizeof
(visited));
017.
queue<state>q;
018.
visited[s1.a][s1.b][s1.c]=1;
019.
q.push(s1);
020.
while
(!q.empty())
021.
{
022.
state s2=q.front();
023.
q.pop();
024.
if
(s2.a==E1&&s2.b==E2&&s2.c==E3)
025.
{
026.
printf
(
"%d\n"
,s2.step);
027.
return
;
028.
}
029.
if
(s2.a>0&&s2.b<V2)
//v1-->v2(因为水杯没有刻度,所以每次倒的时候要么全倒完,
030.
//要么倒另一个杯子余下的全部容量)
031.
{
032.
int
t=min(s2.a,V2-s2.b);
033.
s3.a=s2.a-t;
034.
s3.b=s2.b+t;
035.
s3.c=s2.c;
036.
if
(!visited[s3.a][s3.b][s3.c])
037.
{
038.
visited[s3.a][s3.b][s3.c]=1;
039.
s3.step=s2.step+1;
040.
q.push(s3);
041.
}
042.
}
043.
if
(s2.a>0&&s2.c<V3)
//v1-->v3
044.
{
045.
int
t=min(s2.a,V3-s2.c);
046.
s3.a=s2.a-t;
047.
s3.c=s2.c+t;
048.
s3.b=s2.b;
049.
if
(!visited[s3.a][s3.b][s3.c])
050.
{
051.
visited[s3.a][s3.b][s3.c]=1;
052.
s3.step=s2.step+1;
053.
q.push(s3);
054.
}
055.
}
056.
if
(s2.b>0&&s2.a<V1)
//v2-->v1
057.
{
058.
int
t=min(s2.b,V1-s2.a);
059.
s3.b=s2.b-t;
060.
s3.a=s2.a+t;
061.
s3.c=s2.c;
062.
if
(!visited[s3.a][s3.b][s3.c])
063.
{
064.
visited[s3.a][s3.b][s3.c]=1;
065.
s3.step=s2.step+1;
066.
q.push(s3);
067.
}
068.
}
069.
if
(s2.b>0&&s2.c<V3)
//v2-->v3
070.
{
071.
int
t=min(s2.b,V3-s2.c);
072.
s3.b=s2.b-t;
073.
s3.c=s2.c+t;
074.
s3.a=s2.a;
075.
if
(!visited[s3.a][s3.b][s3.c])
076.
{
077.
visited[s3.a][s3.b][s3.c]=1;
078.
s3.step=s2.step+1;
079.
q.push(s3);
080.
}
081.
}
082.
if
(s2.c>0&&s2.a<V1)
//v3-->v1
083.
{
084.
int
t=min(s2.c,V1-s2.a);
085.
s3.c=s2.c-t;
086.
s3.a=s2.a+t;
087.
s3.b=s2.b;
088.
if
(!visited[s3.a][s3.b][s3.c])
089.
{
090.
visited[s3.a][s3.b][s3.c]=1;
091.
s3.step=s2.step+1;
092.
q.push(s3);
093.
}
094.
}
095.
if
(s2.c>0&&s2.b<V2)
//v3-->v2
096.
{
097.
int
t=min(s2.c,V2-s2.b);
098.
s3.c=s2.c-t;
099.
s3.b=s2.b+t;
100.
s3.a=s2.a;
101.
if
(!visited[s3.a][s3.b][s3.c])
102.
{
103.
visited[s3.a][s3.b][s3.c]=1;
104.
s3.step=s2.step+1;
105.
q.push(s3);
106.
}
107.
}
108.
}
109.
printf
(
"-1\n"
);
110.
}
111.
int
main()
112.
{
113.
int
N;
114.
scanf
(
"%d"
,&N);
115.
while
(N--)
116.
{
117.
scanf
(
"%d%d%d%d%d%d"
,&V1,&V2,&V3,&E1,&E2,&E3);
118.
if
(V1<E1+E2+E3)
119.
printf
(
"-1\n"
);
120.
else
121.
{
122.
s1.a=V1;
123.
s1.b=0;
124.
s1.c=0;
125.
s1.step=0;
126.
bfs();
127.
}
128.
}
129.
return
0;
130.
}