南陽理工OJ_題目21 三個水杯

//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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章