#include <iostream> #include <list> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; /* Przyklad: 2 7 9 1 3 6 odpowiedz: 1 0 1 0 1 1 0 1 2 1 */ long A, B, C; long tab[100003]; int wszystkie(){ for(long int i=0; i<C+1; i++){ if(tab[i]==-1) return 0; } return 1; } void wypisz(){ for(long int i=0; i<C+1; i++){ cout << tab[i] << " "; } cout << endl; } void przelewaj(long a, long b, long c, long krok){ if(krok>C) return; // if(wszystkie()==1) return; if(tab[a]!=-1 && tab[b]!=-1 && tab[c]!=-1 && tab[a]<krok && tab[b]<krok && tab[c]<krok) return; if(tab[a]==-1 || tab[a]>krok) tab[a]=krok; if(tab[b]==-1 || tab[b]>krok) tab[b]=krok; if(tab[c]==-1 || tab[c]>krok) tab[c]=krok; // wypisz(); // cout << "krok:"<<krok<<" a = "<<a<<" b = "<<b<<" c = "<<c <<" A = "<<A << " B = "<<B<<" C = "<<C<<endl; //wszelkiego rodzaju przelewania //przelewanie: //a->b if(a>0 && b<B){ // cout << "krok: "<<krok << "przelewam a->b"<<endl; if(B-b < a) przelewaj(a-B+b, B, c, krok+1); //przelewam az B bedzie pelna else przelewaj(0, a+b, c, krok+1); //przelewam do konca A } // b-> a if(b>0 && a<A){ // cout << "krok: "<<krok << "przelewam b->a"<<endl; if(A-a < b) przelewaj(A, b-A+a, c, krok+1); //przelewam az A bedzie pelna else przelewaj(a+b, 0, c, krok+1); //przelewam do konca B } //a->c if(a>0 && c<C){ // cout << "krok: "<<krok << "przelewam a->c"<<endl; if(C-c < a) przelewaj(a-C+c, b, C, krok+1); //przelewam az C bedzie pelna else przelewaj(0, b, a+c, krok+1); //przelewam do konca A } //c-> a if(c>0 && a<A){ // cout << "krok: "<<krok << "przelewam c->a"<<endl; if(A-a < c) przelewaj(A, b, c-A+a, krok+1); //przelewam az A bedzie pelna else przelewaj(a+c, b, 0, krok+1); //przelewam do konca C } //b->c if(b>0 && c<C){ // cout << "krok: "<<krok << "przelewam b->c"<<endl; if(C-c < b) przelewaj(a, b-C+c, C, krok+1); //przelewam az C bedzie pelna else przelewaj(a, 0, b+c, krok+1); //przelewam do konca B } //c->b if(c>0 && b<B){ // cout << "krok: "<<krok << "przelewam c->b"<<endl; if(B-b < c) przelewaj(a, B, c-B+b, krok+1); //przelewam az B bedzie pelna else przelewaj(a, b+c, 0, krok+1); //przelewam do konca C } } int main(int argc, char** argv) { long a, b, c; long i; cin >> A >> B >> C >> a >> b >> c; for(i=0; i<C+1; i++) tab[i]=-1; przelewaj(a, b, c, 0); wypisz(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <list> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; /* Przyklad: 2 7 9 1 3 6 odpowiedz: 1 0 1 0 1 1 0 1 2 1 */ long A, B, C; long tab[100003]; int wszystkie(){ for(long int i=0; i<C+1; i++){ if(tab[i]==-1) return 0; } return 1; } void wypisz(){ for(long int i=0; i<C+1; i++){ cout << tab[i] << " "; } cout << endl; } void przelewaj(long a, long b, long c, long krok){ if(krok>C) return; // if(wszystkie()==1) return; if(tab[a]!=-1 && tab[b]!=-1 && tab[c]!=-1 && tab[a]<krok && tab[b]<krok && tab[c]<krok) return; if(tab[a]==-1 || tab[a]>krok) tab[a]=krok; if(tab[b]==-1 || tab[b]>krok) tab[b]=krok; if(tab[c]==-1 || tab[c]>krok) tab[c]=krok; // wypisz(); // cout << "krok:"<<krok<<" a = "<<a<<" b = "<<b<<" c = "<<c <<" A = "<<A << " B = "<<B<<" C = "<<C<<endl; //wszelkiego rodzaju przelewania //przelewanie: //a->b if(a>0 && b<B){ // cout << "krok: "<<krok << "przelewam a->b"<<endl; if(B-b < a) przelewaj(a-B+b, B, c, krok+1); //przelewam az B bedzie pelna else przelewaj(0, a+b, c, krok+1); //przelewam do konca A } // b-> a if(b>0 && a<A){ // cout << "krok: "<<krok << "przelewam b->a"<<endl; if(A-a < b) przelewaj(A, b-A+a, c, krok+1); //przelewam az A bedzie pelna else przelewaj(a+b, 0, c, krok+1); //przelewam do konca B } //a->c if(a>0 && c<C){ // cout << "krok: "<<krok << "przelewam a->c"<<endl; if(C-c < a) przelewaj(a-C+c, b, C, krok+1); //przelewam az C bedzie pelna else przelewaj(0, b, a+c, krok+1); //przelewam do konca A } //c-> a if(c>0 && a<A){ // cout << "krok: "<<krok << "przelewam c->a"<<endl; if(A-a < c) przelewaj(A, b, c-A+a, krok+1); //przelewam az A bedzie pelna else przelewaj(a+c, b, 0, krok+1); //przelewam do konca C } //b->c if(b>0 && c<C){ // cout << "krok: "<<krok << "przelewam b->c"<<endl; if(C-c < b) przelewaj(a, b-C+c, C, krok+1); //przelewam az C bedzie pelna else przelewaj(a, 0, b+c, krok+1); //przelewam do konca B } //c->b if(c>0 && b<B){ // cout << "krok: "<<krok << "przelewam c->b"<<endl; if(B-b < c) przelewaj(a, B, c-B+b, krok+1); //przelewam az B bedzie pelna else przelewaj(a, b+c, 0, krok+1); //przelewam do konca C } } int main(int argc, char** argv) { long a, b, c; long i; cin >> A >> B >> C >> a >> b >> c; for(i=0; i<C+1; i++) tab[i]=-1; przelewaj(a, b, c, 0); wypisz(); return 0; } |