您的位置:首页 > 其它

三个水杯

2015-06-29 09:40 176 查看
描述

给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

输入

第一行一个整数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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: