/*简单BFS
Author: shaorui
Date: 2012/9/29
思路简单,就是写起来有点麻烦
思路:用kind[i][j]表示1,2pots中剩的体积为i,j时,从
上一步到这步的操作种类。。。
11:FILL(1)
12:FILL(2)
21:DROP(1)
22: DROP(2)
31: POUR(1,2)
32: POUR(2,1)
prex[i][j],pery[i][j]表示1,2pots中剩的体积为i,j时,
上一步的x,y(即1,2pots中的体积x,y)
*/
#include<iostream>
#include<queue>
using namespace std;
#define maxn 101
struct node
{
int x,y,t;
};
int a,b,c,endx,endy,dx,dy;
int prex[maxn][maxn],prey[maxn][maxn],kind[maxn][maxn];
bool visited[maxn][maxn];
bool BFS()
{
queue<node> q;
node s;
s.x = s.y = s.t = 0;
q.push(s);
memset(visited,false,sizeof(visited));
visited[0][0] = true;
prex[0][0] = prey[0][0] = 0,kind[0][0] = 0;
while(!q.empty())
{
node temp = q.front();
q.pop();
node next;
if(!visited[a][temp.y]) //operate 1 FILL(1)
{
kind[a][temp.y] = 11;
prex[a][temp.y] = temp.x,prey[a][temp.y] = temp.y;
if(a == c)
{
printf("%d\n",temp.t+1);
endx = a,endy = temp.y;
return 1;
}
else
{
next.x = a,next.y = temp.y,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
if(!visited[temp.x][b]) //operate 1 FILL(2)
{
kind[temp.x][b] = 12;
prex[temp.x][b] = temp.x,prey[temp.x][b] = temp.y;
if(b == c)
{
printf("%d\n",temp.t+1);
endx = temp.x,endy = b;
return 1;
}
else
{
next.x = temp.x,next.y = b,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
if(!visited[0][temp.y]) //operate 2, DROP(1)
{
kind[0][temp.y] = 21;
prex[0][temp.y] = temp.x,prey[0][temp.y] = temp.y;
if(c == 0)
{
printf("%d\n",temp.t+1);
endx = 0,endy = temp.y;
return 1;
}
else
{
next.x = 0,next.y = temp.y,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
if(!visited[temp.x][0]) //operate 2, DROP(2)
{
kind[temp.x][0] = 22;
prex[temp.x][0] = temp.x,prey[temp.x][0] = temp.y;
if(c == 0)
{
printf("%d\n",temp.t+1);
endx = temp.x,endy = 0;
return 1;
}
else
{
next.x = temp.x,next.y = 0,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
next.y = temp.x+temp.y; //operate 3 DROP(1,2)
if(next.y <= b)
{
if(next.y == c)
{
kind[0][next.y] = 31;
prex[0][next.y] = temp.x,prey[0][next.y] = temp.y;
printf("%d\n",temp.t+1);
endx = 0,endy = next.y;
return 1;
}
else if(!visited[0][next.y])
{
kind[0][next.y] = 31;
prex[0][next.y] = temp.x,prey[0][next.y] = temp.y;
next.x = 0,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
else
{
if(next.y - b == c)
{
kind[next.y-b][b] = 31;
prex[next.y-b][b] = temp.x,prey[next.y-b][b] = temp.y;
printf("%d\n",temp.t+1);
endx = next.y-b,endy = b;
return 1;
}
else if(!visited[next.y-b][b])
{
kind[next.y-b][b] = 31;
prex[next.y-b][b] = temp.x,prey[next.y-b][b] = temp.y;
next.x = next.y-b,next.y = b,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
next.x = temp.x + temp.y; //operate 3 DROP(1,2)
if(next.x <= a)
{
if(next.x == c)
{
kind[next.x][0] = 32;
prex[next.x][0] = temp.x,prey[next.x][0] = temp.y;
printf("%d\n",temp.t+1);
endx = next.x,endy = 0;
return 1;
}
else if(!visited[next.x][0])
{
kind[next.x][0] = 32;
prex[next.x][0] = temp.x,prey[next.x][0] = temp.y;
next.y = 0,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
else
{
if(next.x - a == c)
{
kind[a][next.x-a] = 32;
prex[a][next.x-a] = temp.x,prey[a][next.x-a] = temp.y;
printf("%d\n",temp.t+1);
endx = a,endy = next.x-a;
return 1;
}
else if(!visited[a][next.x-a])
{
kind[a][next.x-a] = 32;
prex[a][next.x-a] = temp.x,prey[a][next.x-a] = temp.y;
next.y = next.x - a,next.x = a,next.t = temp.t+1;
q.push(next),visited[next.x][next.y] = true;
}
}
}
return 0;
}
void output() //输出操作过程
{
if(endx == 0 && endy == 0)
return;
if(kind[endx][endy] == 11)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("FILL(1)\n");
}
else if(kind[endx][endy] == 12)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("FILL(2)\n");
}
else if(kind[endx][endy] == 21)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("DROP(1)\n");
}
else if(kind[endx][endy] == 22)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("DROP(2)\n");
}
else if(kind[endx][endy] == 31)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("POUR(1,2)\n");
}
else if(kind[endx][endy] == 32)
{
dx = prex[endx][endy],dy = prey[endx][endy];
endx = dx,endy = dy;
output();
printf("POUR(2,1)\n");
}
}
int main()
{
//freopen("3414.txt","r",stdin);
int i,j;
while(scanf("%d%d%d",&a,&b,&c) != EOF)
{
if(BFS())
output();
else
printf("impossible\n");
}
return 0;
}