给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作
FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2);
DROP(i) 将第i个容器抽干
POUR(i,j) 将第i个容器里的水倒入第j个容器(这次操作结束后产生两种结果,一是第j个容器倒满并且第i个容器依旧有剩余,二是第i个容器里的水全部倒入j中,第i个容器为空)
现在要求你写一个程序,来找出能使其中任何一个容器里的水恰好有C升,找出最少操作数并给出操作过程
Input
有且只有一行,包含3个数A,B,C(1<=A,B<=100,C<=max(A,B))
Output
第一行包含一个数表示最小操作数K
随后K行每行给出一次具体操作,如果有多种答案符合最小操作数,输出他们中的任意一种操作过程,如果你不能使两个容器中的任意一个满足恰好C升的话,输出“impossible”
Sample Input
3 5 4
Sample Output
6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
#include<stdio.h>
#include<queue>
using namespace std;
struct bfs
{
int x,y,step;
} a,b,lujing[110][110]; //lujing数组记录路径,以儿子的量为下标,可一层层推出父亲
int n,m,k,biao[110][110],flag;
void hhh() //输出路径的函数
{
int he[10010],s=0,i,xx,yy;
while(a.x!=0||a.y!=0)
{
xx=a.x;
yy=a.y;
he[s++]=lujing[xx][yy].step;//记录方向
a.x=lujing[xx][yy].x;
a.y=lujing[xx][yy].y;
// printf("%d\n",s);
}
for(int j=s-1;j>=0;j--)
{
i=he[j]; //方向
if(i==0)
printf("FILL(1)\n");
else if(i==1)
printf("POUR(1,2)\n");
else if(i==2)
printf("DROP(1)\n");
else if(i==3)
printf("FILL(2)\n");
else if(i==4)
printf("POUR(2,1)\n");
else if(i==5)
printf("DROP(2)\n");
}
}
void hh()
{
queue<bfs>q;
q.push(a);
biao[a.x][a.y]=1;
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==k||a.y==k)
{
flag=1;
printf("%d\n",a.step);
hhh();
return;
}
else
{ a.step++;
for(int i=0; i<6; i++)
{
b=a;
if(i==0)
{b.x=n;
}
else if(i==1)
{
if(b.x>m-b.y)
{
b.x-=m-b.y;
b.y=m;
}
else
{
b.y+=b.x;
b.x=0;
}
}
else if(i==2)
b.x=0;
else if(i==3)
b.y=m;
else if(i==4)
{
if(b.y>n-b.x)
{
b.y-=n-b.x;
b.x=n;
}
else
{
b.x+=b.y;
b.y=0;
}
}
else if(i==5)
b.y=0;
if(biao[b.x][b.y]==0)
{
biao[b.x][b.y]=1;
lujing[b.x][b.y].x=a.x;
lujing[b.x][b.y].y=a.y;
lujing[b.x][b.y].step=i;
// printf("%d %d %d %d\n",b.step,b.x,b.y,i);
q.push(b);
}
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
flag=0;
a.step=a.x=a.y=0;
hh();
if(flag==0)
printf("impossible\n");
}