题意:有A,B两个瓶子,开始是空的,有六种操作,问最少几步能让其中一个瓶子是C的体积;
#include<stdio.h>
#include<string.h>
struct node
{
int a;
int b;
int parent;
int level;
int op;
} pot[10005];
int stk[10005];
int visit[105][105];
void output(int p)
{
int top=0;
stk[0]=p;
while(pot[stk[top]].parent!=-1)
{
top++;
stk[top]=pot[stk[top-1]].parent;
}
for(int i=top; i>=0; i--)
{
switch(pot[stk[i]].op)
{
case 0:
{
printf("DROP(1)\n");
}
break;
case 1:
{
printf("FILL(1)\n");
}
break;
case 2:
{
printf("DROP(2)\n");
}
break;
case 3:
{
printf("FILL(2)\n");
}
break;
case 4:
{
printf("POUR(1,2)\n");
}
break;
case 5:
{
printf("POUR(2,1)\n");
}
break;
}
}
}
void bfs(int A,int B,int C)
{
node cur;
pot[0].a=0;
pot[0].b=0;
pot[0].parent=-1;
pot[0].level=0;
pot[0].op=-1;
int front=0;
int rear=1;
visit[0][0]=1;
int locate=-1,ans;
while(front<rear)
{
cur=pot[front++];
if(cur.a==C||cur.b==C)
{
ans=cur.level;
locate=front-1;
break ;
}
int ta,tb,tp;
for(int i=0; i<6; i++)
{
if(i==0)
{
ta=0;
tb=cur.b;
tp=i;
}
if(i==1)
{
ta=A;
tb=cur.b;
tp=i;
}
if(i==2)
{
tb=0;
ta=cur.a;
tp=i;
}
if(i==3)
{
tb=B;
ta=cur.a;
tp=i;
}
if(i==4)
{
if((B-cur.b)>=cur.a)
{
ta=0;
tb=cur.a+cur.b;
tp=i;
}
else
{
ta=cur.a-(B-cur.b);
tb=B;
tp=i;
}
}
if(i==5)
{
if((A-cur.a)>=cur.b)
{
tb=0;
ta=cur.a+cur.b;
tp=i;
}
else
{
ta=A;
tb=cur.b-(A-cur.a);
tp=i;
}
}
if(visit[ta][tb]==0)
{
visit[ta][tb]=1;
node change;
change.a=ta;
change.b=tb;
change.parent=front-1;
change.level=cur.level+1;
change.op=tp;
pot[rear++]=change;
}
}
}
if(locate==-1)
{
printf("impossible\n");
}
else
{
printf("%d\n",ans);
output(locate);
}
}
int main()
{
int A,B,C;
scanf("%d%d%d",&A,&B,&C);
memset(visit,0,sizeof(visit));
bfs(A,B,C);
return 0;
}