题目链接:http://poj.org/problem?id=1606
bfs+路径保存。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int a[2],f,pre;
}q[1001*1001];
int vis[1001][1001];
int a,b,c;
void way(int f)
{
if(f==1)
printf("fill A\n");
else if(f==2)
printf("fill B\n");
else if(f==3)
printf("pour A B\n");
else if(f==4)
printf("pour B A\n");
else if(f==5)
printf("empty A\n");
else if(f==6)
printf("empty B\n");
else if(f==7)
printf("success\n");
}
void Print(int t)
{
if(t!=-1)
{
Print(q[t].pre);
way(q[t].f);
}
}
void bfs()
{
int front=0,rear=1;
int i,j;
q[front].a[0]=q[front].a[1]=0;
q[front].f=q[front].pre=-1;
while(front!=rear)
{
if(q[front].a[1]==c)
{
q[rear].f=7;
q[rear].pre=front;
Print(rear);
break;
}
if(q[front].a[0]==0&&!vis[a][q[front].a[1]])
{
q[rear].a[0]=a;
q[rear].a[1]=q[front].a[1];
q[rear].f=1;
vis[a][q[front].a[1]]=1;
q[rear++].pre=front;
}
if(q[front].a[1]==0&&!vis[q[front].a[0]][b])
{
q[rear].a[0]=q[front].a[0];
q[rear].a[1]=b;
q[rear].f=2;
vis[q[front].a[0]][b]=1;
q[rear++].pre=front;
}
if(q[front].a[0]!=0&&!vis[0][q[front].a[1]])
{
q[rear].a[0]=0;
q[rear].a[1]=q[front].a[1];
q[rear].f=5;
q[rear++].pre=front;
vis[0][q[front].a[1]]=1;
}
if(q[front].a[1]!=0&&!vis[q[front].a[0]][0])
{
q[rear].a[1]=0;
q[rear].a[0]=q[front].a[0];
q[rear].f=6;
q[rear++].pre=front;
vis[q[front].a[0]][0]=1;
}
if(q[front].a[0]>0)
{
int t=q[front].a[0]+q[front].a[1];
q[rear].a[0]=(t-b<0)?0:t-b;
q[rear].a[1]=t<b?t:b;
if(!vis[q[rear].a[0]][q[rear].a[1]])
{
q[rear].f=3;
vis[q[rear].a[0]][q[rear].a[1]]=1;
q[rear++].pre=front;
}
}
if(q[front].a[1]>0)
{
int t=q[front].a[0]+q[front].a[1];
q[rear].a[1]=(t-a<0)?0:t-a;
q[rear].a[0]=t<a?t:a;
if(!vis[q[rear].a[0]][q[rear].a[1]])
{
q[rear].f=4;
vis[q[rear].a[0]][q[rear].a[1]]=1;
q[rear++].pre=front;
}
}
front++;
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}