POJ 3414 BFS 模拟求最快方式
2016-03-02 20:38
225 查看
点击打开链接
题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。
1.FILL(i):将ipot倒满水。
2.DROP(i):将ipot倒空水。
3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。
bfs求最短路径
题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。
1.FILL(i):将ipot倒满水。
2.DROP(i):将ipot倒空水。
3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。
bfs求最短路径
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<queue> #include<set> #include<map> #define PI acos(-1) #define eps 0.00000001 #define LL long long using namespace std; struct node { int next; int a,b,num,op; }p[1000010]; int a,b,c,top; int acc[1000010]; int vis[1000][1000],j; int BFS() { queue<node>Q; node to; int top=0; p[top].a=0; ///记录第一个pot 存放的值 p[top].b=0; ///记录第一个pot 存放的值 p[top].next=-1; ///记录上一次pot 的下标 p[top].num=0; /// ///记录当前pot 的下标 p[top].op=-1; /// ///记录当前pot 是啥操作之后的结果 Q.push(p[top]); top++; memset(vis,0,sizeof(vis)); while(!Q.empty()) { node t=Q.front(); Q.pop(); if(vis[t.a][t.b]) continue; if(t.a==c||t.b==c) { j=0; int k=t.next; acc[j++]=t.op; while(p[k].next!=-1) { acc[j++]=p[k].op; k=p[k].next; } return 1; } vis[t.a][t.b]=1; for(int i=1;i<=6;i++) { if(i==1) { p[top].a=a; p[top].b=t.b; } if(i==2) { p[top].a=t.a; p[top].b=b; } if(i==3) { p[top].a=0; p[top].b=t.b; } if(i==4) { p[top].a=t.a; p[top].b=0; } if(i==5) { p[top].a=(t.a+t.b-b<0?0:(t.a-b+t.b)); p[top].b=(t.a+t.b-b<0?(t.a+t.b):b); } if(i==6) { p[top].a=(t.a+t.b-a<0?(t.a+t.b):a); p[top].b=(t.a+t.b-a<0?0:(t.a-a+t.b)); } p[top].next=t.num; p[top].op=i; p[top].num=top; Q.push(p[top++]); } } return 0; } int main() { while(~scanf("%d%d%d",&a,&b,&c)) { top=0; int flag=BFS(); if(!flag) { printf("impossible\n"); continue; } printf("%d\n",j); for(int i=j-1;i>=0;i--) { if(acc[i]==1) printf("FILL(1)\n"); if(acc[i]==2) printf("FILL(2)\n"); if(acc[i]==3) printf("DROP(1)\n"); if(acc[i]==4) printf("DROP(2)\n"); if(acc[i]==5) printf("POUR(1,2)\n"); if(acc[i]==6) printf("POUR(2,1)\n"); } } return 0; }
相关文章推荐
- 《JAVA常用算法手册》 算法经典题 3.鸡兔同笼
- 3.redis高并发
- ios架构
- poj 2318 TOYS 2012-01-11
- Cesium中简单的LOD动态加载大量三维模型
- 20145208 《Java程序设计》第0周学习总结
- 试题库问题 2011-12-29
- C++析构函数为什么要为虚函数
- 【C#】基础知识—运算符
- LeetCode258:Add Digits
- 另一个前端优化
- JS原型和闭包
- UVA - 12230 Crossing Rivers (期望)
- ios autolayout中NSLayoutAttributeLeft(Right)与NSLayoutAttributeLeading(Trailing)区别
- Easyui---模态对话框实现ESC键一键锁屏(输入密码解锁)
- 【C#】基础知识—数据类型、数据类型转换
- vs2010开发activex(MFC)控件/ie插件(一)
- 网站前端优化
- hdu2562
- 将项目部署到Tomcat7时遇到的一点小问题