三个水杯
来源:互联网 发布:c数值算法 编辑:程序博客网 时间:2024/04/19 20:07
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数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;}
0 0
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯
- 三个水杯问题
- NYOJ21 三个水杯
- OJ第二批——Problem I:改错题:类中私有成员的访问
- 边缘检测子综述(A review of classic edge detectors[J]. Image Processing On Line, 2012.)
- MongoDB:逐渐变得无关紧要
- Android In <declare-styleable> MenuView, unable to find attribute android:preserveIconSpacing
- Openstack Restful Api
- 三个水杯
- 收益管理系统(PROS)缘何在中国水土不服?
- Preferences.xml的使用
- Android如何修改app不在多任务列表中显示
- 如何修改SVN的地址
- MP平台--增删改查规则
- 使用Versions时.a文件不能成功被提交的解决方法
- CentOS 配置LAMP环境
- There is a circular dependency between XMPPFramework/Core and XMPPFramework/Authentication