此题是倒水问题,用两个已知容量没有刻度的杯子量出一定量的水,可以则输出最短路径
bfs题,只不过方向要自己一个个枚举
#include
#include
const int MAX=102;
int n,m,k,flag,sx,sy;
int path[MAX][MAX][2];
int mark[MAX][MAX];
int vis[MAX][MAX];
int record[MAX][2];
int len[MAX][MAX];
int tol,min;
struct node
{
int x,y;
node(){
}
node(int x,int y){
this->x=x;
this->y=y;
}
}q[MAX*MAX];/*结构体,方便读入*/
void bfs(int x,int y)
{
int begin=0,end=0;
q[end++]=node(x,y);/*将x,y放入队列*/
vis[x][y] = 1;
len[x][y] = 0;
while(begin
d){
xx=now.x-d;
yy=m;
}
else{
xx = 0;
yy = now.y+now.x;
}
}
else if(i==5){
int d;
d = n - now.x;
if(now.y > d){
xx=n;
yy=now.y-d;
}
else{
xx = now.x+now.y;
yy = 0;
}
}
if(vis[xx][yy])
continue;
vis[xx][yy] = 1;
mark[xx][yy]= i;/*记录方向*/
len[xx][yy] = len[now.x][now.y] + 1;
/*记录从哪里拓展而来*/
path[xx][yy][0] = now.x;
path[xx][yy][1] = now.y;
q[end++] = node(xx,yy);
if(xx==k||yy==k){
/*记录最短路径的值*/
if(len[xx][yy] < min){
min = len[xx][yy];
sx = xx;
sy = yy;
}
flag=1;
break;
}
}
}
/*找出最短路径*/
int lx = sx,ly = sy;
while(lx !=-1){
record[tol][0] = lx;
record[tol][1] = ly;
int a = path[lx][ly][0];
int b = path[lx][ly][1];
lx = a;
ly = b;
tol++;
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
flag = 0;
tol = 0;
min = 1000;
sx=-1;sy=-1;
memset(path,-1,sizeof(path));
memset(mark,-1,sizeof(mark));
memset(vis,0,sizeof(vis));
bfs(0,0);
if(flag){
printf("%d\n",min);
for(int i = tol -1; i >= 0;i--){
int k1 = record[i][0];
int k2 = record[i][1];
switch(mark[k1][k2]){
case 0:printf("FILL(1)\n");break;
case 1:printf("FILL(2)\n");break;
case 2:printf("DROP(1)\n");break;
case 3:printf("DROP(2)\n");break;
case 4:printf("POUR(1,2)\n");break;
case 5:printf("POUR(2,1)\n");break;
}
}
}
else printf("impossible\n");
}
return 0;
}