#include <iostream> #include <cstdint> #include <vector> #include <algorithm> #include <iterator> #include <string> #include <numeric> #include <set> #include <tuple> #include <queue> #include <stack> using namespace std; typedef tuple<int, int,int> zestaw; zestaw mieszaj(zestaw plyny, zestaw pojemonosci, int butelki, int kierunek){ int *b1,*b2; int *B1,*B2; if (butelki==2){ b1=&get<1>(plyny); B1=&get<1>(pojemonosci); }else{ b1=&get<0>(plyny); B1=&get<0>(pojemonosci); } if (butelki==0){ b2=&get<1>(plyny); B2=&get<1>(pojemonosci); }else{ b2=&get<2>(plyny); B2=&get<2>(pojemonosci); } if (kierunek){ swap(b1,b2); swap(B1,B2); } int przelej = min(*b1, *B2-*b2); *b1-=przelej; *b2 += przelej; \ return plyny; } void update(int x, vector<int> &przel, int t){ if (przel[x]==-1) przel[x]=t; } int main() { int A,B,C; int a,b,c; cin >> A>>B>>C>>a>>b>>c; zestaw Z = make_tuple(A,B,C); zestaw z = make_tuple(a,b,c); queue <pair<zestaw,int>> Q; Q.push(make_pair(z,0)); set<zestaw> odwiedzone; vector<int> przelewan(C+1,-1); while(!Q.empty()){ int krok; tie(z,krok) = Q.front(); Q.pop(); if ( odwiedzone.count(z)==0 ){ for (int k=0; k<=6; k++ ) Q.push(make_pair(mieszaj(z,Z,k%3,k/3), krok+1 ) ); odwiedzone.insert(z); update(get<0>(z),przelewan,krok); update(get<1>(z),przelewan,krok); update(get<2>(z),przelewan,krok); } } copy( begin(przelewan), end(przelewan), ostream_iterator<int>(cout," ") ); 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 | #include <iostream> #include <cstdint> #include <vector> #include <algorithm> #include <iterator> #include <string> #include <numeric> #include <set> #include <tuple> #include <queue> #include <stack> using namespace std; typedef tuple<int, int,int> zestaw; zestaw mieszaj(zestaw plyny, zestaw pojemonosci, int butelki, int kierunek){ int *b1,*b2; int *B1,*B2; if (butelki==2){ b1=&get<1>(plyny); B1=&get<1>(pojemonosci); }else{ b1=&get<0>(plyny); B1=&get<0>(pojemonosci); } if (butelki==0){ b2=&get<1>(plyny); B2=&get<1>(pojemonosci); }else{ b2=&get<2>(plyny); B2=&get<2>(pojemonosci); } if (kierunek){ swap(b1,b2); swap(B1,B2); } int przelej = min(*b1, *B2-*b2); *b1-=przelej; *b2 += przelej; \ return plyny; } void update(int x, vector<int> &przel, int t){ if (przel[x]==-1) przel[x]=t; } int main() { int A,B,C; int a,b,c; cin >> A>>B>>C>>a>>b>>c; zestaw Z = make_tuple(A,B,C); zestaw z = make_tuple(a,b,c); queue <pair<zestaw,int>> Q; Q.push(make_pair(z,0)); set<zestaw> odwiedzone; vector<int> przelewan(C+1,-1); while(!Q.empty()){ int krok; tie(z,krok) = Q.front(); Q.pop(); if ( odwiedzone.count(z)==0 ){ for (int k=0; k<=6; k++ ) Q.push(make_pair(mieszaj(z,Z,k%3,k/3), krok+1 ) ); odwiedzone.insert(z); update(get<0>(z),przelewan,krok); update(get<1>(z),przelewan,krok); update(get<2>(z),przelewan,krok); } } copy( begin(przelewan), end(przelewan), ostream_iterator<int>(cout," ") ); return 0; } |