#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
const int maxn = 100 + 10;
int A,B,C;
int vis[maxn][maxn];
struct node{
int a,b,step;
char str[111][111];
};
bool bfs(){
queue<node>qq;
memset(vis,-1,sizeof(vis));
node tmp;
tmp.a=0,tmp.b=0,tmp.step=0;
qq.push(tmp);
vis[0][0]=1;
while(!qq.empty()){
tmp=qq.front();
qq.pop();
node t;
if(tmp.a==C||tmp.b==C){
printf("%d\n",tmp.step);
for(int i=1;i<=tmp.step;i++)printf("%s\n",tmp.str[i]);
return true;
}
//1
t=tmp;
t.a=0;
t.b=tmp.b;
t.step=tmp.step+1;
strcpy(t.str[t.step],"DROP(1)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
//2
t=tmp;
t.b=0;
t.a=tmp.a;
t.step=tmp.step+1;
strcpy(t.str[t.step],"DROP(2)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
//3
t=tmp;
t.a=A;
t.b=tmp.b;
t.step=tmp.step+1;
strcpy(t.str[t.step],"FILL(1)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
//4
t=tmp;
t.a=tmp.a;
t.b=B;
t.step=tmp.step+1;
strcpy(t.str[t.step],"FILL(2)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
//5
t=tmp;
t.a=min(A,tmp.a+tmp.b);
t.b=tmp.a+tmp.b-t.a;
t.step=tmp.step+1;
strcpy(t.str[t.step],"POUR(2,1)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
//6
t=tmp;
t.b=min(B,tmp.a+tmp.b);
t.a=tmp.a+tmp.b-t.b;
t.step=tmp.step+1;
strcpy(t.str[t.step],"POUR(1,2)");
if(vis[t.a][t.b]==-1){
vis[t.a][t.b]=1;
qq.push(t);
}
}
return false;
}
int main(){
while(~scanf("%d%d%d",&A,&B,&C)){
if(!bfs())printf("impossible\n");
}
}
这个题不算难
分六个状态讨论就行了
直接上代码