http://poj.org/problem?id=3414
题意:
给你两个容量为a,b的杯子;有3个操作:
1:FILL(i);把第i个杯子从水库中装满;
2:DROP(i);把第i个杯子清空;
3:POUR(i,j);把第i个杯子的水移入到j中,直到第i个杯子空了或者第j个杯子满了为止;
分析:本题和上篇的差不多,多的就是输出路径;
包含六个过程:水池—>a; 水池—>b;a->水池;b->水池;a->b;b->a;
| prea
pre[x][y] | preb
| op
第一个杯子的水量为x,第二个杯子水量为y它是由第一个水量为pre[x][y].prea、第二个水量为pre[x][y].preb经过操作op来变成的;
最后根据最终两个杯子中水的剩余量把路径倒着存入path中;
代码如下:
#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #define N 110 using namespace std; struct node { int a,b,step; friend bool operator< (node a,node b) { return a.step>b.step; } }; struct NODE { int prea,preb,op; }; NODE pre[N][N]; int a,b,c,flag; int vis[N][N]; node bfs() { int i; priority_queue<node>Q; node p,q; p.a=p.b=0; p.step=0; pre[0][0].prea=pre[0][0].prea=pre[0][0].op=0; memset(vis,0,sizeof(vis)); vis[0][0]=1; Q.push(p); while(!Q.empty()) { q=Q.top(); Q.pop(); if(q.a==c||q.b==c) { flag=1; return q; } for(i=1;i<=6;i++) { if(i==1)//FILL(1); { p.a=a; p.b=q.b; } if(i==2)//FILL(2); { p.a=q.a; p.b=b; } if(i==3)//DROP(1) { p.a=0; p.b=q.b; } if(i==4)//DROP(2) { p.a=q.a; p.b=0; } if(i==5)//POUR(1,2) { if(b-q.b>=q.a)//a倒b中,a倒完了; { p.a=0; p.b=q.a+q.b; } else { p.b=b; p.a=q.a-(b-q.b); } } if(i==6)//POUR(2,1) { if(a-q.a>=q.b)//b倒a中,b倒完了; { p.b=0; p.a=q.a+q.b; } else { p.a=a; p.b=q.b-(a-q.a); } } if(vis[p.a][p.b]==0) { vis[p.a][p.b]=1; p.step=q.step+1; pre[p.a][p.b].prea=q.a; pre[p.a][p.b].preb=q.b; pre[p.a][p.b].op=i; Q.push(p); } } } } int main() { node re; int path[N],i,x,y,step,x1; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { memset(path,0,sizeof(path)); flag=0; re=bfs(); if(flag==0) { printf("impossible "); } else { printf("%d ",re.step); step=re.step; x=re.a; y=re.b; for(i=step;i>=1;i--)//把路径保存在path中; { path[i]=pre[x][y].op; x1=x; x=pre[x1][y].prea;//更新x,y; y=pre[x1][y].preb; } for(i=1;i<=re.step;i++) { if(path[i]==1) { printf("FILL(1) "); } if(path[i]==2) { printf("FILL(2) "); } if(path[i]==3) { printf("DROP(1) "); } if(path[i]==4) { printf("DROP(2) "); } if(path[i]==5) { printf("POUR(1,2) "); } if(path[i]==6) { printf("POUR(2,1) "); } } } } return 0; }