简单题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define maxn 105
struct Node
{
int va, vb, step, pre, opr;
} q[maxn * maxn];
int a, b, c, l, r;
bool vis[maxn][maxn];
int stk[maxn * maxn], top;
void make(int va, int vb, int opr)
{
if (vis[va][vb])
return;
vis[va][vb] = true;
q[r].va = va;
q[r].vb = vb;
q[r].step = q[l].step + 1;
q[r].opr = opr;
q[r].pre = l;
r++;
}
void output()
{
top = 0;
while (l != 0)
{
stk[top++] = q[l].opr;
l = q[l].pre;
}
printf("%d\n", top);
for (int i = top - 1; i >= 0; i--)
switch (stk[i])
{
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(2,1)\n");
break;
case 6:
printf("POUR(1,2)\n");
break;
}
}
void bfs()
{
q[0].va = 0;
q[0].vb = 0;
q[0].step = 0;
vis[0][0] = true;
l = 0;
r = 1;
while (l != r)
{
if (q[l].va == c || q[l].vb == c)
{
output();
return;
}
int xa, xb, x;
xa = a;
xb = q[l].vb;
make(xa, xb, 1);
xa = q[l].va;
xb = b;
make(xa, xb, 2);
xa = 0;
xb = q[l].vb;
make(xa, xb, 3);
xa = q[l].va;
xb = 0;
make(xa, xb, 4);
x = min(a - q[l].va, q[l].vb);
xa = q[l].va + x;
xb = q[l].vb - x;
make(xa, xb, 5);
x = min(b - q[l].vb, q[l].va);
xa = q[l].va - x;
xb = q[l].vb + x;
make(xa, xb, 6);
l++;
}
printf("impossible\n");
}
int main()
{
//freopen("t.txt", "r", stdin);
scanf("%d%d%d", &a, &b, &c);
memset(vis, 0, sizeof(vis));
bfs();
return 0;
}