三个水杯
2015-06-29 09:40
176 查看
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数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; }
相关文章推荐
- 查看SELinux状态
- window下的hosts
- 【再思考】PATBasic——1033. 旧键盘打字(20)
- DELL硬件监控OMSA客户端版
- OJ第二批——Problem I:改错题:类中私有成员的访问
- java-web-j2e学习建议路线
- 多线程编程(五)--线程池
- 边缘检测子综述(A review of classic edge detectors[J]. Image Processing On Line, 2012.)
- 登录shell与非登录shell读取文件过程
- 黑马程序员——java基础之异常
- APP界面设计之尺寸篇
- Python中if __name__ == '__main__'作用解析
- mysql几种存储引擎介绍
- Linux系统递归生成目录中文件的md5的方法
- IEnumerable和IEnumerator 详解
- 浅谈凸优化问题中的Bregman迭代算法
- 多线程编程(四)--线程同步
- java迷宫算法
- 执行sql语句后的数据处理api
- LeetCode_62---Unique Paths