题目大意:给你两个瓶子,问能否经过下面的三种操作,使得任意一个瓶子中存在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;
}