// UVa 571 - Jugs
#include <iostream>
#include <string>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
string move[6] = { "fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A" };
struct state {
int a, b;
};
int T[1001][1001];
state R[1001][1001];
int sa, sb;
int oo;
int ca, cb, n;
queue<state> q;
bool check(int a1, int b1, int move, int a, int b) {
if (T[a1][b1] == oo) {
T[a1][b1] = move;
state st = { a, b };
R[a1][b1] = st;
state st1 = { a1, b1 };
q.push(st1);
if (b1 == n) {
sa = a1;
sb = b1;
return true;
}
}
return false;
}
int main() {
while (cin >> ca >> cb >> n) {
memset(T, 255, sizeof(T));
oo = T[0][0];
T[0][0] = 6;
q = queue<state>();
state ini = { 0, 0 };
q.push(ini);
sa = 0;
sb = 0;
while (!q.empty()) {
int a = q.front().a;
int b = q.front().b;
q.pop();
// fill A
int a1 = ca;
int b1 = b;
if (check(a1, b1, 0, a, b))
break;
// fill B
a1 = a;
b1 = cb;
if (check(a1, b1, 1, a, b))
break;
// empty A
a1 = 0;
b1 = b;
if (check(a1, b1, 2, a, b))
break;
// empty B
a1 = a;
b1 = 0;
if (check(a1, b1, 3, a, b))
break;
// pour A B
int m = min(a, cb - b);
a1 = a - m;
b1 = b + m;
if (check(a1, b1, 4, a, b))
break;
// pour B A
m = min(ca - a, b);
a1 = a + m;
b1 = b - m;
if (check(a1, b1, 5, a, b))
break;
}
vector<int> sol;
int a = sa;
int b = sb;
while (a || b) {
sol.push_back(T[a][b]);
int aa = R[a][b].a;
b = R[a][b].b;
a = aa;
}
for (int i = sol.size() - 1; i >= 0; i--)
cout << move[sol[i]] << endl;
cout << "success" << endl;
}
return 0;
}
Wednesday, June 10, 2015
UVa 571 - Jugs
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment