三个水杯

来源:互联网 发布:淘宝网男羽绒服中长款 编辑:程序博客网 时间:2024/04/25 16:25
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
26 3 14 1 19 3 27 1 1
样例输出
3-1
//标程:
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;struct ss{    int a[3];    int step;};int s[4], e[4];bool vis[101][101][101];bool judge_target(ss tmp){    if(tmp.a[0] == e[0] && tmp.a[1] == e[1] && tmp.a[2] == e[2])        return true;    return false;}void f(int k, int i, ss &tmp){    int x = s[k] - tmp.a[k];    if(tmp.a[i] >= x)    {        tmp.a[k] += x;        tmp.a[i] -= x;    }    else    {        tmp.a[k] += tmp.a[i];        tmp.a[i] = 0;    }}int bfs(){    queue<ss> q;    memset(vis,0,sizeof(vis));    ss start;    start.a[0] = s[0], start.a[1] = start.a[2] = 0;    start.step = 0;    q.push(start);    vis[start.a[0]][0][0] = true;    while(!q.empty())    {        ss tmp = q.front();        q.pop();        if(judge_target(tmp))  return tmp.step;        for(int i = 0; i < 3; ++ i)        {            for(int j = 1; j < 3; ++ j)            {                int k = (i + j) % 3;                if(tmp.a[i] != 0 && tmp.a[k] < s[k])                {                    ss new_tmp = tmp;                    f(k,i,new_tmp);                    new_tmp.step = tmp.step + 1;                    if(!vis[new_tmp.a[0]][new_tmp.a[1]][new_tmp.a[2]])                    {                        vis[new_tmp.a[0]][new_tmp.a[1]][new_tmp.a[2]] = true;                        q.push(new_tmp);                    }                }            }        }    }    return -1;}int main(){//    freopen("a.txt","r",stdin);    int t;    cin >> t;    while(t --)    {        cin >> s[0] >> s[1] >> s[2];        cin >> e[0] >> e[1] >> e[2];        cout << bfs() << endl;    }    return 0;}
0 0
原创粉丝点击