题目链接: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-2 42 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-1 47 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 }
时间: 2024-10-11 07:39:33