#include #define MAX 1011 int kapa,kapb,goal,ok; int i, j, k, x, y; int oda[MAX][MAX]; int odb[MAX][MAX]; int kolik[MAX][MAX]; int co[MAX][MAX]; int fra[MAX * MAX + 10]; int frb[MAX * MAX + 10]; int uka1, ukb1, uka2, ukb2; int konec, a, b; void tisk(int a, int b) { // printf(";"); if (a == 0 && b == 0) return; tisk(oda[a][b], odb[a][b]); switch (co[a][b]) { case 1: printf("fill A\n"); break; case 2: printf("fill B\n"); break; case 3: printf("empty A\n"); break; case 4: printf("empty A\n"); break; case 5: printf("pour B A\n"); break; case 6: printf("pour A B\n"); break; default: break; } } void push(int a, int b) { fra[uka1++] = a; frb[ukb1++] = b; } int isempty() { return (uka1 <= uka2); } int popa(void) { return fra[uka2++]; } int popb(void) { return frb[ukb2++]; } int main (void) { ok = scanf("%d %d %d", &kapa, &kapb, &goal); while (ok != EOF) { for (i = 0; i < MAX; i++) for (j = 0; j < MAX; j++) kolik[i][j] = 0; uka1 = ukb1 = uka2 = ukb2 = 0; push(0,0); kolik[0][0] = 0; while ( !isempty() ) { a = popa(); b = popb(); // printf("(%d,%d) ", a, b); if (a == goal || b == goal) break; if (kolik[a][b] > 0) continue; kolik[a][b] = 1; push(kapa,b); oda[kapa][b] = a; odb[kapa][b] = b; co[kapa][b] = 1; push(a,kapb); oda[a][kapb] = a; odb[a][kapb] = b; co[a][kapb] = 2; push(0,b); oda[0][b] = a; odb[0][b] = b; co[0][b] = 3; push(a,0); oda[a][0] = a; odb[a][0] = b; co[a][0] = 4; if (a > kapb - b) { x = a - (kapb - b); y = kapb; } else { y = b + a; x = 0; } push(x,y); oda[x][y] = a; odb[x][y] = b; co[x][y] = 5; if (b > kapa - a) { y = b - (kapa - a); x = kapa; } else { x = b + a; y = 0; } push(x,y); oda[x][y] = a; odb[x][y] = b; co[x][y] = 6; } printf("a = %d, b = %d, %d\n", a, b, kolik[a][b]); if (a != goal && b != goal) printf("spatne.."); // tisk(a,b); printf("succes\n\n"); ok = scanf("%d %d %d", &kapa, &kapb, &goal); } return 0; }