描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct Node{
int x;
int y;
int z;
int ans;
}node[105][105][105];
int leap[105][105][105];
queue<Node>p;
int main()
{
int i, j, m, n, ans, v1, v2, v3, k, tempx, tempy, tempz, p1, p2, p3;
Node temp, now;
cin >> n;
while (n--)
{
scanf("%d%d%d", &v1, &v2, &v3);
for (i = 0; i <= v1;i++)
for (j = 0; j <= v2;j++)
for (k = 0; k <= v3; k++)
{
leap[i][j][k] = 0;
node[i][j][k].x = i;
node[i][j][k].y = j;
node[i][j][k].z = k;
node[i][j][k].ans = -1;
}
node[v1][0][0].ans = 0;
leap[v1][0][0] = 1;
p.push(node[v1][0][0]);
while (p.size())
{
temp = p.front();
tempx = temp.x; tempy = temp.y; tempz = temp.z;
if (tempx + tempy > v2)
{
now.x = tempx - (v2 - tempy);
now.y = v2;
now.z = tempz;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempx + tempz > v3)
{
now.x = tempx - (v3 - tempz);
now.y = tempy;
now.z = v3;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempy + tempz > v2)
{
now.x = tempx;
now.y = v2;
now.z = tempz - (v2 - tempy);
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempy + tempz > v3)
{
now.x = tempx;
now.y = tempy - (v3 - tempz);
now.z = v3;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempx + tempy <= v1)
{
now.x = tempx + tempy;
now.y = 0;
now.z = tempz;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempx + tempy <= v2)
{
now.x = 0;
now.y = tempx + tempy;
now.z = tempz;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempx + tempz <= v1)
{
now.x = tempx + tempz;
now.y = tempy;
now.z = 0;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempx + tempz <= v3)
{
now.x = 0;
now.y = tempy;
now.z = tempx + tempz;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempy + tempz <= v2)
{
now.x = tempx;
now.y = tempy + tempz;
now.z = 0;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
if (tempy + tempz <= v3)
{
now.x = tempx;
now.y = 0;
now.z = tempy + tempz;
if (!leap[now.x][now.y][now.z])
{
leap[now.x][now.y][now.z] = 1;
node[now.x][now.y][now.z].ans = temp.ans + 1;
p.push(node[now.x][now.y][now.z]);
}
}
p.pop();
}
cin >> p1 >> p2 >> p3;
if (node[p1][p2][p3].ans==-1)
{
cout << "-1" << endl;
}
else
cout << node[p1][p2][p3].ans << endl;
}
return 0;
}