POJ 3414

来源:互联网 发布:java 读取ini 编辑:程序博客网 时间:2024/06/02 12:38

bfs不解释

#include <stdio.h>#define maxn 101int visit[maxn][maxn];int vol[2];//容量int c;int flag;typedef struct TNode//定义状态{int cop[2];int fa;//父节点int dis;//距离int op;//操作}Node;Node node[maxn*maxn];void printPath(int tem)//递归打印操作{if(node[tem].op!=-1)printPath(node[tem].fa);if(node[tem].op!=-1){int i=node[tem].op/10;int j=node[tem].op%10;int k=(j==0?1:0);j+=1;k+=1;if(i==0){printf("FILL(%d)\n",j);}else if(i==1){printf("DROP(%d)\n",j);}else{printf("POUR(%d,%d)\n",j,k);}return;}}void bfs(){int font=0,rear=1;node[font].cop[0]=node[font].cop[1]=node[font].fa=node[font].dis=0;node[font].op=-1;visit[node[font].cop[0]][node[font].cop[1]]=1;while(font<rear){Node &u=node[font];if(node[font].cop[0]==c||node[font].cop[1]==c){flag=1;printf("%d\n",node[font].dis);printPath(font);return;}int i,j;for(i=0;i<3;i++)//3种操作{for(j=0;j<2;j++)//操作的对象{Node &v=node[rear];v.cop[0]=u.cop[0];v.cop[1]=u.cop[1];if(i==0){ v.cop[j]=vol[j];}else if(i==1){v.cop[j]=0;}else{int k=(j==0?1:0);int amount=(v.cop[j]<(vol[k]-v.cop[k])?v.cop[j]:(vol[k]-v.cop[k]));v.cop[j]-=amount;v.cop[k]+=amount;}if(!visit[v.cop[0]][v.cop[1]]){visit[v.cop[0]][v.cop[1]]=1;v.fa=font;v.dis=u.dis+1;v.op=i*10+j;rear++;}}}font++;}}int main(){while(scanf("%d",&vol[0])!=EOF){flag=0;scanf("%d %d" ,&vol[1],&c);bfs();if(!flag){printf("impossible\n");}}return 0;}