AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
struct node{
int a,b,t;
bool operator < (const node &tmp)const{
return t > tmp.t;
}
};
struct path{
int x,y;
}pa[105][105];
int a,b,c;
int vis[105][105];
priority_queue<node> q;
void solve(int a,int b,node cur,int mode){
if(!vis[a][b]){
vis[a][b] = mode;
pa[a][b].x = cur.a;
pa[a][b].y = cur.b;
q.push(node{a,b,cur.t+1});
}
}
node bfs(){
node cur;
while(!q.empty())
q.pop();
memset(vis,0,sizeof(vis));
vis[0][0] = -1;
pa[0][0].x = -1;
pa[0][0].y = -1;
q.push(node{0,0,0});
while(!q.empty()){
cur = q.top();
q.pop();
if(cur.a == c || cur.b == c){
return cur;
}
//一共6种状态
//1.fill:a
solve(a,cur.b,cur,1);
//2.fill:b
solve(cur.a,b,cur,2);
//3.drop:a
solve(0,cur.b,cur,3);
//4.drop:b
solve(cur.a,0,cur,4);
//5.pour:a->b
if(cur.a >= b-cur.b){
solve(cur.a-(b-cur.b),b,cur,5);
}
else{
solve(0,cur.a+cur.b,cur,5);
}
//6.pour:b->a
if(cur.b >= a-cur.a){
solve(a,cur.b-(a-cur.a),cur,6);
}
else{
solve(cur.a+cur.b,0,cur,6);
}
}
return node{-1,-1,-1};
}
void printpath(int x,int y,int t){
if(!t)
return ;
printpath(pa[x][y].x,pa[x][y].y,t-1);
switch(vis[x][y]){
case 1:
printf("FILL(1)\n");
break;
case 2:
printf("FILL(2)\n");
break;
case 3:
printf("DROP(1)\n");
break;
case 4:
printf("DROP(2)\n");
break;
case 5:
printf("POUR(1,2)\n");
break;
case 6:
printf("POUR(2,1)\n");
break;
}
}
int main(){
while(~scanf("%d%d%d",&a,&b,&c)){
node ans = bfs();
if(ans.t < 0)
printf("impossible\n");
else{
printf("%d\n",ans.t);
printpath(ans.a,ans.b,ans.t);
}
}
return 0;
}