#ifdef _MSC_VER #ifndef __GNUC__ #pragma warning(disable: 4996) #endif #define main main0 #endif #include <algorithm> #include <iostream> #include <list> #include <map> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; const ll milion = 1000000; int wyniki[100005]; map<ll, int> mapaStanow; list<ll> listaStanow; int ruchow, rozwiazan; bool AeqB, BeqC; void ObliczStan(int *but) { int a = but[0], b = but[1], c = but[2]; if(AeqB && (a > b)) swap(a, b); if(BeqC && (b > c)) swap(b, c); if(AeqB && (a > b)) swap(a, b); ll klucz = ((ll)a * milion + b) * milion + c; if(mapaStanow.insert(pair<ll,int>(klucz, ruchow)).second) { listaStanow.push_back(klucz); if(wyniki[a] < 0) { wyniki[a] = ruchow; ++rozwiazan; } if(wyniki[b] < 0) { wyniki[b] = ruchow; ++rozwiazan; } if(wyniki[c] < 0) { wyniki[c] = ruchow; ++rozwiazan; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int butelka[3]; int oranzada[3]; int C_Plus1; ll klucz; mapaStanow.clear(); listaStanow.clear(); ruchow = 0; rozwiazan = 0; cin >> butelka[0] >> butelka[1] >> butelka[2];//A B C cin >> oranzada[0] >> oranzada[1] >> oranzada[2];//a b c C_Plus1 = butelka[2] + 1; if(butelka[0] == butelka[1]) AeqB = true; else AeqB = false; if(butelka[1] == butelka[2]) BeqC = true; else BeqC = false; fill_n(wyniki, C_Plus1, -1); if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]); if(BeqC && (oranzada[1] > oranzada[2])) swap(oranzada[1], oranzada[2]); if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]); klucz = ((ll)oranzada[0] * milion + oranzada[1]) * milion + oranzada[2]; mapaStanow.insert(pair<ll,int>(klucz, ruchow)); listaStanow.push_back(klucz); wyniki[oranzada[0]] = 0; rozwiazan = 1; if(wyniki[oranzada[1]] < 0) { wyniki[oranzada[1]] = 0; ++rozwiazan; } if(wyniki[oranzada[2]] < 0) { wyniki[oranzada[2]] = 0; ++rozwiazan; } while(!(listaStanow.empty() || (rozwiazan >= C_Plus1))) { klucz = listaStanow.front(); listaStanow.pop_front(); oranzada[2] = klucz % milion; oranzada[1] = klucz / milion % milion; oranzada[0] = klucz / milion / milion % 1000000; ruchow = mapaStanow.find(klucz)->second + 1; for(int iOd = 0; iOd < 3; ++iOd) { int iDo = (iOd + 1) % 3; int iInne = (iOd + 2) % 3; int but[3]; if(oranzada[iOd] > 0) { for(int i = 0; i < 2; ++i) { if(oranzada[iOd] + oranzada[iDo] <= butelka[iDo]) { but[iOd] = 0; but[iDo] = oranzada[iDo] + oranzada[iOd]; but[iInne] = oranzada[iInne]; ObliczStan(but); } else { but[iOd] = oranzada[iOd] - (butelka[iDo] - oranzada[iDo]); but[iDo] = butelka[iDo]; but[iInne] = oranzada[iInne]; ObliczStan(but); } swap(iDo, iInne); } } } } for(int i = 0; i < C_Plus1; ++i) cout << wyniki[i] << ' '; cout << endl; 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 | #ifdef _MSC_VER #ifndef __GNUC__ #pragma warning(disable: 4996) #endif #define main main0 #endif #include <algorithm> #include <iostream> #include <list> #include <map> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; const ll milion = 1000000; int wyniki[100005]; map<ll, int> mapaStanow; list<ll> listaStanow; int ruchow, rozwiazan; bool AeqB, BeqC; void ObliczStan(int *but) { int a = but[0], b = but[1], c = but[2]; if(AeqB && (a > b)) swap(a, b); if(BeqC && (b > c)) swap(b, c); if(AeqB && (a > b)) swap(a, b); ll klucz = ((ll)a * milion + b) * milion + c; if(mapaStanow.insert(pair<ll,int>(klucz, ruchow)).second) { listaStanow.push_back(klucz); if(wyniki[a] < 0) { wyniki[a] = ruchow; ++rozwiazan; } if(wyniki[b] < 0) { wyniki[b] = ruchow; ++rozwiazan; } if(wyniki[c] < 0) { wyniki[c] = ruchow; ++rozwiazan; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int butelka[3]; int oranzada[3]; int C_Plus1; ll klucz; mapaStanow.clear(); listaStanow.clear(); ruchow = 0; rozwiazan = 0; cin >> butelka[0] >> butelka[1] >> butelka[2];//A B C cin >> oranzada[0] >> oranzada[1] >> oranzada[2];//a b c C_Plus1 = butelka[2] + 1; if(butelka[0] == butelka[1]) AeqB = true; else AeqB = false; if(butelka[1] == butelka[2]) BeqC = true; else BeqC = false; fill_n(wyniki, C_Plus1, -1); if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]); if(BeqC && (oranzada[1] > oranzada[2])) swap(oranzada[1], oranzada[2]); if(AeqB && (oranzada[0] > oranzada[1])) swap(oranzada[0], oranzada[1]); klucz = ((ll)oranzada[0] * milion + oranzada[1]) * milion + oranzada[2]; mapaStanow.insert(pair<ll,int>(klucz, ruchow)); listaStanow.push_back(klucz); wyniki[oranzada[0]] = 0; rozwiazan = 1; if(wyniki[oranzada[1]] < 0) { wyniki[oranzada[1]] = 0; ++rozwiazan; } if(wyniki[oranzada[2]] < 0) { wyniki[oranzada[2]] = 0; ++rozwiazan; } while(!(listaStanow.empty() || (rozwiazan >= C_Plus1))) { klucz = listaStanow.front(); listaStanow.pop_front(); oranzada[2] = klucz % milion; oranzada[1] = klucz / milion % milion; oranzada[0] = klucz / milion / milion % 1000000; ruchow = mapaStanow.find(klucz)->second + 1; for(int iOd = 0; iOd < 3; ++iOd) { int iDo = (iOd + 1) % 3; int iInne = (iOd + 2) % 3; int but[3]; if(oranzada[iOd] > 0) { for(int i = 0; i < 2; ++i) { if(oranzada[iOd] + oranzada[iDo] <= butelka[iDo]) { but[iOd] = 0; but[iDo] = oranzada[iDo] + oranzada[iOd]; but[iInne] = oranzada[iInne]; ObliczStan(but); } else { but[iOd] = oranzada[iOd] - (butelka[iDo] - oranzada[iDo]); but[iDo] = butelka[iDo]; but[iInne] = oranzada[iInne]; ObliczStan(but); } swap(iDo, iInne); } } } } for(int i = 0; i < C_Plus1; ++i) cout << wyniki[i] << ' '; cout << endl; return 0; } |