倒水问题
2015-11-06 10:58
302 查看
题目:
设大、中、小3个杯子的容量分别为a,b,c,最初只有大杯子装满水,其他两个杯子为空。最少需要多少步才能让某一个杯子中的水有x升呢?你需要打印出每步操作后各个杯子中的水量(0 < c < b < a < 1000)。
分析:经典的BFS
设大、中、小3个杯子的容量分别为a,b,c,最初只有大杯子装满水,其他两个杯子为空。最少需要多少步才能让某一个杯子中的水有x升呢?你需要打印出每步操作后各个杯子中的水量(0 < c < b < a < 1000)。
分析:经典的BFS
#include <stdio.h> #include <iostream> using namespace std; const int maxn = 100005; int a, b, c, x; struct node { int f; int a, b, c; }; node p[maxn]; void print(node w) { if (w.f != -1) print(p[w.f]); printf("%d %d %d\n", w.a, w.b, w.c); } void get(int &x, int &y, int m) { int sub = m - y; if (x >= sub) { x -= sub; y = m; } else { y += x; x = 0; } } node pour(node t, int op) { switch(op) { case 0: { get(t.a, t.b, b); return t; } case 1: { get(t.a, t.c, c); return t; } case 2: { get(t.b, t.c, c); return t; } case 3: { get(t.b, t.a, a); return t; } case 4: { get(t.c, t.a, a); return t; } case 5: { get(t.c, t.b, b); return t; } } } void bfs() { int head, end; p[head = end = 0].a = a; p[head].b = 0; p[head].c = 0; p[end++].f = -1; while (head < end) { node w = p[head]; if (w.a == x || w.b == x || w.c == x) { print(w); break; } node t; t = pour(w, 0); t.f = head; p[end++] = t; t = pour(w, 1); t.f = head; p[end++] = t; t = pour(w, 2); t.f = head; p[end++] = t; t = pour(w, 3); t.f = head; p[end++] = t; t = pour(w, 4); t.f = head; p[end++] = t; t = pour(w, 5); t.f = head; p[end++] = t; ++head; } } int main() { while (scanf("%d %d %d %d", &a, &b, &c, &x) == 4) { bfs(); } return 0; }
相关文章推荐
- Java for Web学习笔记(三):Servlet(1)Maven
- 同、异步,阻、非阻塞,生命周期相关问题
- Javascript模块化编程(三):require.js的用法
- nginx和Tomcat集成后发生的重定向问题分析和解决
- Eclipse配置AspectJ插件AJDT
- struts2中改变struts.xml默认路径或可能遇到的问题
- 如何将网上下载的程序安装到自己的iphone上
- Popuwindow点击外部控件切换popuwindow——解决点击外部事件不响应问题。
- zigbee网关 利用现有的网络实现全球控制
- TMS320F28335项目开发记录9_28335中断系统
- dhcp原理、安装、相关命令、疑惑
- 黑马程序员---自学随堂笔记----基本数据类型
- 应用程序无响应的原因
- Unix操作系统之分区、LVM配置过程
- 0000006_java学习之路_JAVA日期处理
- LeetCode ZigZag Conversion
- iOS CoreAnimation动画系列教程
- 6个技巧让你成为专业程序员
- mysql group by 用法解析(详细)
- hibernate one-to-many,one-to-one,many-to-one怎么理解??