题解:总共是有6种可能,所以直接列出来bfs就可以,注意数据大小都在100一下。注意队列的大小
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
/*
题解,总共有六种情况,bfs
FILL(i)
FILL(j)
DROP(i)
DROP(j)
POUR(i,j)
POUR(j,i)
*/
using namespace std;
struct node
{
int a; //代表a的水
int b; //代表b的水
int x;//从1到6代表六种种操作
int per; //前驱
};
int main()
{
int n,m,k;
int i,j;
int head,tail;
int ans=-1;
int vis[110][110];
int f[1110];
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
struct node que[40000];
head=0;
tail=1;
ans=-1;
que[0].a=0;
que[0].b=0;
vis[0][0]=1;
while(head<4000&&tail<399950)
{
int k1=que[head].a,k2=que[head].b;
//1
if(vis[n][k2]==0)
{
que[tail].a=n;
que[tail].b=k2;
que[tail].per=head;
que[tail].x=1;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[n][k2]=1;
}
//2
if(vis[k1][m]==0)
{
que[tail].a=k1;
que[tail].b=m;
que[tail].x=2;
que[tail].per=head;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[k1][m]=1;
}
//3
if(vis[0][k2]==0)
{
que[tail].a=0;
que[tail].b=k2;
que[tail].x=3;
que[tail].per=head;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[0][k2]=1;
}
//4
if(vis[k1][0]==0)
{
que[tail].a=k1;
que[tail].b=0;
que[tail].x=4;
que[tail].per=head;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[k1][0]=1;
}
//5POUR(a,b)从a倒入b
int temp=k1+k2;
int newa,newb;
if(temp>m)
{
newa=temp-m;
newb=m;
}
else
{
newa=0;
newb=temp;
}
if(vis[newa][newb]==0)
{
que[tail].a=newa;
que[tail].b=newb;
que[tail].x=5;
que[tail].per=head;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[newa][newb]=1;
}
//6POUR(b,a)从b倒入a
if(temp>n)
{
newa=n;
newb=temp-n;
}
else
{
newa=temp;
newb=0;
}
if(vis[newa][newb]==0)
{
que[tail].a=newa;
que[tail].b=newb;
que[tail].x=6;
que[tail].per=head;
if(que[tail].a==k||que[tail].b==k)
{
ans=tail;
break;
}
tail++;
vis[newa][newb]=1;
}
head++;
}
if(ans!=-1)
{
int sum=0,root=ans;
while(root!=0)
{
f[sum]=que[root].x;
sum++;
root=que[root].per;
}
printf("%d\n",sum);
for(i=sum-1; i>=0; i--)
{
if(f[i]==1)
{
printf("FILL(1)\n");
}
if(f[i]==2)
{
printf("FILL(2)\n");
}
if(f[i]==3)
{
printf("DROP(1)\n");
}
if(f[i]==4)
{
printf("DROP(2)\n");
}
if(f[i]==5)
{
printf("POUR(1,2)\n");
}
if(f[i]==6)
{
printf("POUR(2,1)\n");
}
}
}
else
{
printf("impossible\n");
}
}
}