bfs不解释
#include <stdio.h> #define maxn 101 int 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; }