POJ 3414 Pots

来源:互联网 发布:java线程源码 编辑:程序博客网 时间:2024/05/29 14:07

传送门:POJ3414

题意:有两个容量已知的杯子,给定倒水的方法,问怎么能够倒出C单位水来。

倒水方法:1.FILL(i) 将i杯倒满

   2.DROP(i)将i杯倒空

   3.POUR(i,j)将i杯的水倒入j杯中(若满则停止)。

思路:个人建议做这题之前先去做一下HDU1495,把那题搞明白这题就剩下路径输出的问题了。

其实这题也就难在路径输出上,因为倒水方法都给定了,bfs直接写就行了。。路径输出的话将每种倒水方法编号,然后bfs过程中记录一下前驱,最后逆过来输出就好了。

代码:

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<queue>#include<stack>#include<set>#include<vector>#include<map>#define ll long long#define pi acos(-1)#define inf 0x3f3f3f3fusing namespace std;typedef pair<int,int>P;int A,B,C;bool book[101][101];struct node{int a,b,pre,step;int id;};node que[10010];int path[10010];//0-FILL(1) 1-FILL(2) 2-DROP(1) 3-DROP(2) 4-POUR(1,2) 5-POUR(2,1)void bfs(){int tail,front;node t,q;t.a=t.b=t.step=front=tail=0;t.pre=-1;que[tail++]=t;book[0][0]=1;while(front!=tail){t=que[front++];if(t.a==C||t.b==C)break;for(int i=0;i<6;i++){q=t;switch (i){case 0: q.a=A;q.id=0;break;case 1: q.b=B;q.id=1;break;case 2: q.a=0;q.id=2;break;case 3: q.b=0;q.id=3;break;case 4:if(t.a+t.b>B){q.b=B;q.a=t.a+t.b-B;q.id=4;}else{q.b+=q.a;q.a=0;q.id=4;}break;case 5:if(t.a+t.b>A){q.a=A;q.b=t.a+t.b-A;q.id=5;}else{q.a+=q.b;q.b=0;q.id=5;}break;}if(!book[q.a][q.b]){book[q.a][q.b]=1;q.pre=front-1;q.step++;que[tail++]=q;}}}if(front==tail){printf("impossible\n");return ;}else{int k=1;for(int i=front-1;i>0;i=que[i].pre)path[k++]=i;printf("%d\n",que[front-1].step);while(--k){//printf("%d\n",que[path[k]].step);switch (que[path[k]].id){case 0:printf("FILL(1)\n");break;case 1:printf("FILL(2)\n");break;case 2:printf("DROP(1)\n");break;case 3:printf("DROP(2)\n");break;case 4:printf("POUR(1,2)\n");break;case 5:printf("POUR(2,1)\n");break;}}}}int main(){while(~scanf("%d%d%d",&A,&B,&C)){memset(book,0,sizeof(book));bfs();}    return 0;}



0 0
原创粉丝点击