三个水杯
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
-
输入
-
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
- 每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1 样例输入
-
2 6 3 1 4 1 1 9 3 2 7 1 1
样例输出
-
3 -1
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> using namespace std; #define MAX 100 typedef struct { int big; int medium; int small; int step; }Glass; queue<Glass> q; int v1,v2,v3; int e1,e2,e3; int f[MAX][MAX][MAX]; int flag; void three_glasses(); int main() { int n,i; Glass g; scanf("%d", &n); for(i = 0; i < n; i++) { memset(f, 0, sizeof(f)); flag = 0; while(!q.empty()) q.pop(); scanf("%d%d%d", &v1,&v2,&v3); scanf("%d%d%d", &e1,&e2,&e3); g.big = v1; g.medium = 0; g.small = 0; g.step = 0; f[g.big][g.medium][g.small] = 1; q.push(g); three_glasses(); if(flag == 0) printf("-1\n"); } return 0; } void three_glasses() { int i; while(!q.empty()) { Glass g,t; for(i = 1; i <= 6; i++)//六种状态; { g = q.front(); t = g; if(t.big == e1 && t.medium == e2 && t.small == e3) { flag = 1; printf("%d\n", t.step); return ; } if(i == 1 && g.big && g.small != v3)//大杯像小杯 { if(g.big <= v3 - g.small)//大杯中的水比小杯中剩余空间小; { t.big = 0; t.small = g.small + g.big; } else//大杯中的水比小杯中的水多; { t.big = g.big - (v3 - g.small); t.small = v3; } t.step = g.step +1; } if(i == 2 && g.big && g.medium != v2)//大杯向中杯; { if(g.big <= v2 - g.medium)//大杯中的水中杯中剩余水少; { t.big = 0; t.medium = g.medium + g.big; } else { t.big = g.big - (v2 - g.medium); t.medium = v2; } t.step = g.step +1; } if(i == 3 && g.small != v3 && g.medium)//中杯向小杯到水; { if(g.medium <= v3 - g.small)//中杯中的水比小杯中剩余的空间少; { t.medium = 0; t.small = g.small + g.medium; } else { t.medium = g.medium - (v3 - g.small); t.small = v3; } t.step = g.step +1; } if(i == 4 && g.small && g.medium != v2)//小杯向中杯 { if(v2 - g.medium <= g.small)//小杯中的水多余中杯中的剩余空间; { t.medium = v2; t.small = g.small - (v2 - g.medium); } else { t.medium = g.medium + g.small; t.small = 0; } t.step = g.step +1; } if(i == 5 && g.small && g.big != v1)//小杯想大杯 { if(g.small <= v1 - g.big)//小杯中的水少于大杯中的剩余空间; { t.big = g.big + g.small; t.small = 0; } else { t.big = v1; t.small = g.small - (v1 - g.big); } t.step = g.step +1; } if(i == 6 && g.medium && g.big != v1)//中杯向大杯; { if(g.medium <= (v1 - g.big))//中杯的水少于大杯剩余空间; { t.big = g.big + g.medium; t.medium = 0; } else { t.big = v1; t.medium = g.medium - (v1 - g.big); } t.step = g.step +1; } if((t.big +t.medium + t.small == v1) &&t.big >= 0 && t.medium >= 0 && t.small >= 0 && t.big <= v1 && t.medium <= v2 && t.small <= v3 && f[t.big][t.medium][t.small] == 0 ) { f[t.big][t.medium][t.small] = 1; q.push(t); } if(i == 6) { q.pop(); break; } } } }
-
第一行一个整数N(0<N<50)表示N组测试数据