题目大意:给你两个瓶子,问能否经过下面的三种操作,使得任意一个瓶子中存在V单位的水,操作如下:
操作1:将该瓶子的水装满
操作2:将该瓶子的水倒掉
操作3:将第i个瓶子的水倒到第j个瓶子,直到i空或者j满

解题思路:分六种情况讨论,倒满第一个瓶子,倒满第二个瓶子,倒空第一个瓶子,倒空第二个瓶子,将第一个瓶子的水倒到第二个瓶子内,将第二个瓶子的水倒到第一个瓶子内

在开数组纪录一下状态和操作即可

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;

struct Node{
    int v1, v2, time;
    Node() {}
    Node(int v1, int v2, int time): v1(v1), v2(v2), time(time) {}
};

int pathX[N][N], pathY[N][N], op[N][N], obj1[N][N], obj2[N][N];
int vis[N][N];
int A, B, C;

void out(int v1, int v2) {
    if (v1 == 0 && v2 == 0) return ;
    out(pathX[v1][v2], pathY[v1][v2]);
    if (op[v1][v2] == 1)
        printf("FILL(%d)\n", obj1[v1][v2]);
    else if (op[v1][v2] == 2)
        printf("DROP(%d)\n", obj1[v1][v2]);
    else 
        printf("POUR(%d,%d)\n", obj1[v1][v2], obj2[v1][v2]);
}

void solve() {
    queue<Node> Q;
    memset(vis, 0, sizeof(vis));
    Q.push(Node(0, 0, 0));
    vis[0][0] = 0;

    while (!Q.empty()) {
        Node t = Q.front(); Q.pop();
        if(t.v1 == C || t.v2 == C) {
            printf("%d\n", t.time);
            out(t.v1, t.v2);
            return ;
        }
        //fill one
        if (t.v1 != A && !vis[A][t.v2]) {
            vis[A][t.v2] = true;
            Q.push(Node(A, t.v2, t.time + 1));
            op[A][t.v2] = 1;
            obj1[A][t.v2] = 1;
            obj2[A][t.v2] = 0;
            pathX[A][t.v2] = t.v1;
            pathY[A][t.v2] = t.v2;
        }

        //fill two
        if (t.v2 != B && !vis[t.v1][B]) {
            vis[t.v1][B] = true;
            Q.push(Node(t.v1, B, t.time + 1));
            op[t.v1][B] = 1;
            obj1[t.v1][B] = 2;
            obj2[t.v1][B] = 0;
            pathX[t.v1][B] = t.v1;
            pathY[t.v1][B] = t.v2;
        }

        //drop one
        if (t.v1 != 0 && !vis[0][t.v2]) {
            vis[0][t.v2] = true;
            Q.push(Node(0, t.v2, t.time + 1));
            op[0][t.v2] = 2;
            obj1[0][t.v2] = 1;
            obj2[0][t.v2] = 0;
            pathX[0][t.v2] = t.v1;
            pathY[0][t.v2] = t.v2;
        }
        //drop two
        if (t.v2 != 0 && !vis[t.v1][0]) {
            vis[t.v1][0] = true;
            Q.push(Node(t.v1, 0, t.time + 1));
            op[t.v1][0] = 2;
            obj1[t.v1][0] = 2;
            obj2[t.v1][0] = 0;
            pathX[t.v1][0] = t.v1;
            pathY[t.v1][0] = t.v2;
        }

        //pour one two
        int v2 = (t.v1 + t.v2 >= B ? B : t.v1 + t.v2);
        int v1 = (t.v1 + t.v2 - v2);
        if (!vis[v1][v2]) {
            vis[v1][v2] = true;
            Q.push(Node(v1, v2, t.time + 1));
            op[v1][v2] = 3;
            obj1[v1][v2] = 1;
            obj2[v1][v2] = 2;
            pathX[v1][v2] = t.v1;
            pathY[v1][v2] = t.v2;
        }
        //pour two one
        v1 = (t.v1 + t.v2 >= A ? A : t.v1 + t.v2);
        v2 = (t.v1 + t.v2 - v1);
        if (!vis[v1][v2]) {
            vis[v1][v2] = true;
            Q.push(Node(v1, v2, t.time + 1));
            op[v1][v2] = 3;
            obj1[v1][v2] = 2;
            obj2[v1][v2] = 1;
            pathX[v1][v2] = t.v1;
            pathY[v1][v2] = t.v2;
        }
    }
    printf("impossible\n");
}

int main() {
    while (scanf("%d%d%d", &A, &B, &C) != EOF) solve();

    return 0;
}