首页 > 代码库 > 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+路径记录)