#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; } |
English