//bfs
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int bfs();
struct data
{
int v1;
int v2;
int v3;
int d;
};
int v1, v2, v3;
int x, y ,z;
char vis[101][101][101];
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> v1 >> v2 >> v3;
cin >> x >> y >> z;
memset(vis, 0, sizeof(vis));
cout << bfs() << '\n';
}
}
int bfs()
{
queue<data> q;
data t;
data a;
t.v1 = v1;
t.v2 = 0;
t.v3 = 0;
t.d = 0;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
vis[t.v1][t.v2][t.v3] = 1;
q.push(t);
while(!q.empty())
{
a = q.front();
q.pop();
if(a.v1 != 0 && a.v2 != v2) //v1 -> v2
{
if(a.v1 >= (v2-a.v2))
{
t.v1 = a.v1 - (v2-a.v2);
t.v2 = v2;
t.v3 = a.v3;
}
else
{
t.v1 = 0;
t.v2 = a.v2 + a.v1;
t.v3 = a.v3;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
if(a.v1 != 0 && a.v3 != v3) //v1 -> v3
{
if(a.v1 >= (v3-a.v3))
{
t.v1 = a.v1 - (v3-a.v3);
t.v2 = a.v2;
t.v3 = v3;
}
else
{
t.v1 = 0;
t.v2 = a.v2;
t.v3 = a.v3 + a.v1;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
if(a.v2 != 0 && a.v1 != v1) //v2 -> v1
{
if(a.v2 >= (v1-a.v1))
{
t.v1 = v1;
t.v2 = a.v2 - (v1-a.v1);
t.v3 = a.v3;
}
else
{
t.v1 = a.v1 + a.v2;
t.v2 = 0;
t.v3 = a.v3;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
if(a.v2 != 0 && a.v3 != v3) //v2 -> v3
{
if(a.v2 >= (v3-a.v3))
{
t.v1 = a.v1;
t.v3 = v3;
t.v2 = a.v2 - (v3-a.v3);
}
else
{
t.v1 = a.v1;
t.v3 = a.v3 + a.v2;
t.v2 = 0;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
if(a.v3 != 0 && a.v1 != v1) //v3 -> v1
{
if(a.v3 >= (v1-a.v1))
{
t.v1 = v1;
t.v2 = a.v2;
t.v3 = a.v3 - (v1-a.v1);
}
else
{
t.v1 = a.v1 + a.v3;
t.v2 = a.v2;
t.v3 = 0;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
if(a.v3 != 0 && a.v2 != v2) //v3 -> v2
{
if(a.v3 >= (v2-a.v2))
{
t.v1 = a.v1;
t.v2 = v2;
t.v3 = a.v3 - (v2-a.v2);
}
else
{
t.v1 = a.v1;
t.v2 = a.v2 + a.v3;
t.v3 = 0;
}
t.d = a.d + 1;
if(t.v1 == x && t.v2 == y && t.v3 == z)
return t.d;
if(vis[t.v1][t.v2][t.v3] == 0)
{
q.push(t);
vis[t.v1][t.v2][t.v3] = 1;
}
}
}
return -1;
}
南陽理工OJ_題目21 三個水杯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.