20130421.4 倒水问题(BFS)
来源:互联网 发布:开通网络电视怎么收费 编辑:程序博客网 时间:2024/06/07 02:14
【编程题】
给你两个烧杯,其容积分别是A升和B升。允许进行下列操作:
1.FILL(i) 从水管接水将烧杯i灌满((1 ≤ i ≤ 2)
2.DROP(i) 将第i个烧杯倒空
3.POUR(i,j) 将烧杯i的水倒进烧杯j;并且倒完后要么烧杯j是满的(烧杯i中也许有剩水),要么烧杯i是空的(此时烧杯i的水应该全部倒进烧杯j)。
写一个程序寻找最少的操作序列,使得这两个烧杯中的某一个烧杯中只剩C升水。
输入
仅仅1行,是数字A,B,C。它们都是整数,范围1到100并且C≤max(A,B)。
输出
第1行是操作序列的长度K。接下来的K行中,每行描述一次操作。如果存在多个最小长度序列,可以输出它们中间的任何一个。如果目标不可达,输出impossible。
样例输入
3 5 4
样例输出
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
(简单的宽度优先搜索,不过要先判断最多多少种情况)
#include<iostream>#include<stdlib.h>#include<stack>using namespace std;stack<int> s;typedef struct{int a;int b;int fa;int op;}ST;char operation[6][20] = {"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};int vis[100][100];ST arr[10000];int main(){ST now;int A,B,C;int prior,next,pos;cin>>A>>B>>C;arr[0].a = 0;arr[0].b = 0;arr[0].fa = -1;prior = 0; next = 1;while(prior < next){now = arr[prior];if(now.a == C || now.b == C)break;if(now.a != A){arr[next].a = A;arr[next].b = now.b;arr[next].fa = prior;arr[next].op = 0;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}if(now.b != B){arr[next].b = B;arr[next].a = now.a;arr[next].fa = prior;arr[next].op = 1;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}if(now.a != 0){arr[next].a = 0;arr[next].b = now.b;arr[next].fa = prior;arr[next].op = 2;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}if(now.b != 0){arr[next].b = 0;arr[next].a = now.a;arr[next].fa = prior;arr[next].op = 3;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}if(now.a != 0 && now.b != B){if(now.a + now.b <= B){arr[next].a = 0;arr[next].b = now.a + now.b;}else{arr[next].a = now.a - (B-now.b);arr[next].b = B;}arr[next].fa = prior;arr[next].op = 4;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}if(now.b != 0 && now.a != A){if(now.a + now.b <= A){arr[next].b = 0;arr[next].a = now.a + now.b;}else{arr[next].b = now.b - (A-now.a);arr[next].a = A;}arr[next].fa = prior;arr[next].op = 5;if(!vis[arr[next].a][arr[next].b]){vis[arr[next].a][arr[next].b] = 1;next++;}}prior++;}if(prior >= next) cout<<"impossible"<<endl;else{pos = prior;while(arr[pos].fa != -1){s.push(arr[pos].op);pos = arr[pos].fa;}while(!s.empty()){cout<<operation[s.top()]<<endl;s.pop();}}//system("pause");return 0;}
- 20130421.4 倒水问题(BFS)
- 水杯倒水问题 bfs
- UVA10603 倒水问题 BFS
- codevs1226 倒水问题 bfs
- pots 倒水问题(bfs)
- 7.5.2倒水问题(BFS)
- poj 3414 倒水问题 bfs
- 【codevs1226】倒水问题,BFS练习
- hdu1495 bfs解决倒水问题
- 算法学习-倒水问题(bfs)
- (转载)BFS 倒水问题 HDU 1495倒水问题
- POJ 3414 Pots(BFS倒水问题)
- poj 3414 Pots [bfs - 倒水问题]
- 10603 - Fill,倒水问题 bfs解
- POJ 3414 Pots【bfs模拟倒水问题】
- POJ 3414 Pots【bfs模拟倒水问题】
- POJ3414 模拟倒水问题 BFS记录路径
- HDU - 1495 非常可乐(倒水问题BFS)
- Debian linux 6.0.7安装scim中文拼音输入法 添加源是关键
- 操作系统——进程管理
- Cstyle的UEFI导读之Override Protocol
- Wince之旅2——设备控制(重启网卡为例)
- MongoDB的用户管理
- 20130421.4 倒水问题(BFS)
- 【木头Cocos2d-x 009】游戏实例-《跑跑跑》制作教程(第一篇)——加载地图
- 二进制理解(1)
- 责任链模式
- linux下如何解压windows 下的RAR压缩文件
- Oracle内连接、外连接、右外连接、全外连接小总结
- 回头看
- oracle 外连接的使用
- 算法学习二三事