1 #include<cstdio>
2 #include<queue>
3 #include<cstring>
4 using namespace std;
5
6 bool visit[101][101][101];//用来标记已经出现过的状态
7 int content[3];
8 int achieve[3];
9
10 struct status
11 {
12 int state[3];
13 int step;
14 };
15
16 bool ifachieve(status a)
17 {
18 int i;
19 for(i=0;i<3;i++)
20 {
21 if(a.state[i]!=achieve[i])
22 return false;
23 }
24 return true;
25 }//判断是否达到目标状态
26
27 status pour(int receiver,int refer,status a)
28 {
29 int temp=content[receiver]-a.state[receiver];
30 if(temp<=a.state[refer])
31 {
32 a.state[refer]-=temp;
33 a.state[receiver]+=temp;
34 }
35 else
36 {
37 a.state[receiver]+=a.state[refer];
38 a.state[refer]=0;
39 }
40 return a;
41 }
42 //模拟倒水过程,分被倒入水杯所剩容量小于等于供水水杯容量和大于供水水杯容量两种情况
43
44 int BFS(void)
45 {
46 int i,j,k;
47 memset(visit,true,sizeof(visit));
48 queue<status>expand;
49 status initial;//初始状态
50 initial.state[0]=content[0];
51 initial.step=initial.state[1]=initial.state[2]=0;
52 expand.push(initial);//初始状态进队
53 visit[initial.state[0]][initial.state[1]][initial.state[2]]=false;
54 while(!expand.empty())
55 {
56 status node=expand.front();
57 expand.pop();//取队首并让队首出队
58 if(ifachieve(node))
59 return node.step;
60 for(i=0;i<3;i++)
61 for(j=0;j<3;j++)
62 {
63 if(i!=j)
64 if(node.state[i]!=0&&node.state[j]<content[j])
65 {
66 status newnode=pour(j,i,node);//用循环从当前状态搜索下一状态的所有可能性
67 newnode.step=node.step+1;
68 if(visit[newnode.state[0]][newnode.state[1]][newnode.state[2]])
69 {
70 visit[newnode.state[0]][newnode.state[1]][newnode.state[2]]=false;
71 expand.push(newnode);
72 }//判断倒水后的状态是否已经出现过,没有出现过则进队.
73 }
74 }
75 }
76 return -1;
77 }
78
79 int main()
80 {
81 //freopen("in.txt","r",stdin);
82 int t;
83 scanf("%d",&t);
84 while(t--)
85 {
86 scanf("%d%d%d",&content[0],&content[1],&content[2]);
87 scanf("%d%d%d",&achieve[0],&achieve[1],&achieve[2]);
88 int ans=BFS();
89 printf("%d\n",ans);
90 }
91 return 0;
92 }