#include #include typedef struct st { int oper, a, b; int last; st(int ai = 0, int bi = 0, int operi = -1, int lasti = -1) { a = ai; b = bi; oper = operi; last = lasti; } /* st operator =(st &x) { a = x.a; b = x.b; oper = x.oper; last = x.last; return st(a, b, oper, last); }*/ } state; //typedef std::list queue; state queue[1010*1010]; int qindex; int states[1010][1010]; int ctr; int a, b, n; int sa, sb, si; void Clear() { for(int i = 0; i <= 1000; i++) for(int j = 0; j <= 1000; j++) states[i][j] = -1; } void Solve(int x, int y) { qindex = 0; int qfirst = 0; int how; queue[qindex++] = st(x, y); state act; while(true) { act = queue[qfirst++]; // printf("Oper: %d\n", act.oper); if (act.a == n || act.b == n) { sa = act.a; sb = act.b; si = qfirst-1; // printf("Done %d %d", qfirst, si); return; } // fill if (states[a][act.b] != ctr) { states[a][act.b] = ctr; queue[qindex++] = st(a, act.b, 0, qfirst-1); } if (states[act.a][b] != ctr) { states[act.a][b] = ctr; queue[qindex++] = st(act.a, b, 1, qfirst-1); } // empty if (states[0][act.b] != ctr) { states[0][act.b] = ctr; queue[qindex++] = st(0, act.b, 2, qfirst-1); } if (states[act.a][0] != ctr) { states[act.a][0] = ctr; queue[qindex++] = st(act.a, 0, 3, qfirst-1); } // pour a->b how = act.a > b - act.b ? b - act.b : act.a; if (states[act.a-how][act.b+how] != ctr) { states[act.a-how][act.b+how] = ctr; queue[qindex++] = st(act.a-how, act.b+how, 4, qfirst-1); } // pour b->a how = act.b > a - act.a ? a - act.a : act.b; if (states[act.a+how][act.b-how] != ctr) { states[act.a+how][act.b-how] = ctr; queue[qindex++] = st(act.a+how, act.b-how, 5, qfirst-1); } } } void Draw(int index) { if (queue[index].last != -1) Draw(queue[index].last); // else { // printf("Oper: %d %d\n", index, queue[index].oper); if (queue[index].oper == 0) printf("fill A\n"); if (queue[index].oper == 1) printf("fill B\n"); if (queue[index].oper == 2) printf("empty A\n"); if (queue[index].oper == 3) printf("empty B\n"); if (queue[index].oper == 4) printf("pour A B\n"); if (queue[index].oper == 5) printf("pour B A\n"); // } } int main() { ctr = 0; Clear(); int err = scanf("%d %d %d\n", &a, &b, &n); while(err != EOF) { si = -1; Solve(0, 0); ctr++; // printf("Si %d\n", si); Draw(si); printf("success\n\n"); err = scanf("%d %d %d\n", &a, &b, &n); } return 0; }