南阳理工OJ_题目21 三个水杯

来源:互联网 发布:等到烟火清凉 知乎 编辑:程序博客网 时间:2024/04/30 03:53
//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;}

0 0