题意:
给你三个数:a,b,c
让你通过一系列的动作,初始时,A=B=0;使得A=c或者B=c;
动作:
1,A=a;
2,B=b;
3,A=0;B=B;
4,A=A,B=0;
5,A=(B往A中走,最大不超过a),B=走剩下的。
6,B=(A往B中走,最大不超过b),A=走剩下的。
做法:
总共就有6中情况,bfs就行。注意当A,B都满了的时候,不走5,6;
#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct list
{
int x;
int y;
int vis[1000];
int step;
}p,pp;
int a,b,c;
queue<struct list>q;
int visit[101][101];
void change(int x,int y,int z)
{
if(!visit[x][y])
{
visit[x][y]=1;
pp=p;
pp.x=x;
pp.y=y;
pp.vis[++pp.step]=z;
q.push(pp);
}
}
void put()
{
int i;
printf("%d\n",p.step);
for(i=1;i<=p.step;i++)
{
switch(p.vis[i])
{
case 1:printf("FILL(%d)\n",1);break;
case 2:printf("FILL(%d)\n",2);break;
case 3:printf("DROP(%d)\n",1);break;
case 4:printf("DROP(%d)\n",2);break;
case 5:printf("POUR(%d,%d)\n",1,2);break;
case 6:printf("POUR(%d,%d)\n",2,1);break;
}
}
}
int main()
{
cin>>a>>b>>c;
memset(visit,0,sizeof(visit));
p.x=0;
p.y=0;
p.step=0;
p.vis[0]=0;
visit[0][0]=1;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
if(p.x==c||p.y==c)
{
put();
return 0;
}
change(a,p.y,1);
change(p.x,b,2);
change(0,p.y,3);
change(p.x,0,4);
int xx,yy;
if(p.x==a&&p.y==b)continue;
if(p.x+p.y>a)xx=a,yy=p.y-a+p.x;
else xx=p.x+p.y,yy=0;
change(xx,yy,6);
if(p.x+p.y>b)
{
xx=p.x-b+p.y,yy=b;
}
else xx=0,yy=p.x+p.y;
change(xx,yy,5);
}
printf("impossible\n");
return 0;
}