三个水杯

来源:互联网 发布:c数值算法 编辑:程序博客网 时间:2024/04/19 20:07

描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数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;}
0 0
原创粉丝点击