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;
}