首页 > 代码库 > POJ - 3414 Pots (BFS+路径记录)
POJ - 3414 Pots (BFS+路径记录)
题目链接:http://poj.org/problem?id=3414
题意:两个空杯子倒水,使得任意一个杯子中的水量达到题目要求,有6种操作:装满a,装满b,倒掉a,倒掉b,a->b,b->a。
题解:模拟一下操作,就好了。
1 #include <queue> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=111; 8 string type[7]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"}; 9 int a,b,c;10 struct node{11 int x,y;12 int step;13 int pre;14 int idx;15 }next[maxn*maxn];16 int vis[maxn][maxn];17 18 void print(int k){19 if(next[k].pre!=-1){20 print(next[k].pre);21 cout<<type[next[k].idx]<<endl;22 } 23 }24 25 void bfs(){26 queue <node> Q;27 int r=1,w=0;28 node now;29 next[0].x=0;next[0].y=0;next[0].pre=-1;next[0].idx=0;next[0].step=0;30 Q.push(next[0]);31 vis[0][0]=1; 32 while(!Q.empty()){33 now=Q.front();Q.pop();34 if(now.x==c||now.y==c) {cout<<now.step<<endl;print(now.pre);cout<<type[now.idx]<<endl;return ;}35 for(int i=1;i<=6;i++){36 next[r].x=now.x;next[r].y=now.y;next[r].idx=i;37 if(i==1) next[r].x=a;38 if(i==2) next[r].y=b;39 if(i==3) next[r].x=0;40 if(i==4) next[r].y=0;41 if(i==5){//1-242 int tmp=b-next[r].y;43 if(tmp>=next[r].x) {next[r].y+=next[r].x;next[r].x=0;}44 else {next[r].y=b;next[r].x-=tmp;}45 }46 if(i==6){//2-147 int tmp=a-next[r].x;48 if(tmp>=next[r].y) {next[r].x+=next[r].y;next[r].y=0;}49 else {next[r].x=a;next[r].y-=tmp;}50 }51 if(!vis[next[r].x][next[r].y]){52 vis[next[r].x][next[r].y]=1;53 next[r].pre=w;54 next[r].step=now.step+1;55 Q.push(next[r]);56 r++;//一直往外扩散 57 }58 }59 w++;//这个相当于从这个点分散出去,在纸上模拟一遍就出来了 60 } 61 cout<<"impossible"<<endl;62 }63 64 int main(){65 memset(vis,0,sizeof(vis));66 cin>>a>>b>>c;67 bfs();68 return 0; 69 }
POJ - 3414 Pots (BFS+路径记录)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。