这个题是个BFS加了一点难度的题。
需要保存前一节点的在队列中的位置,操作等……
下面是代码:
#include <stdio.h>
#include <string.h>
int a,b,c;
bool vis[105][105];
struct node
{
int x,y,pr;
char s[10];
} qu[15000],du,dc;
char c1[10000][10];
int main()
{
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
memset(qu,0,sizeof(qu));
memset(vis,0,sizeof(vis));
int l=0,r=0,cut=0;
du.x=0;
du.y=0;
du.pr=-1;
strcpy(du.s,"begin");
qu[r]=du;
r++;
vis[0][0]=1;
int flat=0;
while(l!=r)
{
du=qu[l];
if(du.x==c||du.y==c)
{
flat=1;
break;
}
if(du.x<a&&!vis[a][du.y])
{
vis[a][du.y]=1;
dc.x=a;
dc.y=du.y;
dc.pr=l;
strcpy(dc.s,"FILL(1)");
qu[r]=dc;
r++;
}
if(du.y<b&&!vis[du.x][b])
{
vis[du.x][b]=1;
dc.x=du.x;
dc.y=b;
dc.pr=l;
strcpy(dc.s,"FILL(2)");
qu[r]=dc;
r++;
}
if(du.x+du.y<=a&&!vis[du.x+du.y][0])
{
vis[du.x+du.y][0]=1;
dc.x=du.x+du.y;
dc.y=0;
dc.pr=l;
strcpy(dc.s,"POUR(2,1)");
qu[r]=dc;
r++;
}
if(du.y-a+du.x>0&&!vis[a][du.y-a+du.x])
{
vis[a][du.y-a+du.x]=1;
dc.x=a;
dc.y=du.y-a+du.x;
dc.pr=l;
strcpy(dc.s,"POUR(2,1)");
qu[r]=dc;
r++;
}
if(du.x+du.y<=b&&!vis[0][du.x+du.y])
{
vis[0][du.x+du.y]=1;
dc.y=du.x+du.y;
dc.x=0;
dc.pr=l;
strcpy(dc.s,"POUR(1,2)");
qu[r]=dc;
r++;
}
if(du.x-b+du.y>0&&!vis[du.x-b+du.y][b])
{
vis[du.x-b+du.y][b]=1;
dc.y=b;
dc.x=du.x-b+du.y;
dc.pr=l;
strcpy(dc.s,"POUR(1,2)");
qu[r]=dc;
r++;
}
if(du.x!=0&&!vis[0][du.y])
{
vis[0][du.y]=1;
dc.x=0;
dc.y=du.y;
dc.pr=l;
strcpy(dc.s,"DROP(1)");
qu[r]=dc;
r++;
}
if(du.y!=0&&!vis[du.x][0])
{
vis[du.y][0]=1;
dc.y=0;
dc.x=du.x;
dc.pr=l;
strcpy(dc.s,"DROP(2)");
qu[r]=dc;
r++;
}
l++;
}
if(flat)
{
int a;
strcpy(c1[cut],du.s);
a=du.pr;
cut++;
while(a!=-1)
{
du=qu[a];
strcpy(c1[cut],du.s);
a=du.pr;
cut++;
}
printf("%d\n",cut-1);
for(int i=cut-2;i>=0;i--)
{
puts(c1[i]);
}
}
else
{
printf("impossible\n");
}
}
return 0;
}