#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <set>
#include <vector>
#include <map>
#include <tuple>
#include <deque>
using namespace std;
#define LL long long
LL b1,b2,b3,o1,o2,o3;
set<tuple<LL,LL,LL>> odw;
deque<pair<tuple<LL,LL,LL>,LL>> q;
LL odl=0;
map<LL,LL> s;
LL zostalo(LL o1, LL o2, LL b)
{
if(o1+o2>b) return o1+o2-b;
return 0;
}
LL przelane(LL o1, LL o2, LL b)
{
if(o1+o2>b) return b;
return o1+o2;
}
void policz(tuple<LL,LL,LL> t, LL odl)
{
//printf("policz %lld %lld %lld odl %lld\n",get<0>(t),get<1>(t),get<2>(t),odl);
if(odw.find(t) != odw.end()) return;
odw.insert(t);
auto [o1,o2,o3] = t;
if(s.find(o1) == s.end()) s[o1]=odl;
if(s.find(o2) == s.end()) s[o2]=odl;
if(s.find(o3) == s.end()) s[o3]=odl;
q.push_back(make_pair(make_tuple(zostalo(o1,o2,b2),przelane(o1,o2,b2),o3),odl+1));
q.push_back(make_pair(make_tuple(zostalo(o1,o3,b3),o2,przelane(o1,o3,b3)),odl+1));
q.push_back(make_pair(make_tuple(o1,zostalo(o2,o3,b3),przelane(o2,o3,b3)),odl+1));
q.push_back(make_pair(make_tuple(przelane(o2,o1,b1),zostalo(o2,o1,b1),o3),odl+1));
q.push_back(make_pair(make_tuple(o1,przelane(o3,o2,b2),zostalo(o3,o2,b2)),odl+1));
q.push_back(make_pair(make_tuple(przelane(o3,o1,b1),o2,zostalo(o3,o1,b1)),odl+1));
}
int main() {
scanf("%lld%lld%lld%lld%lld%lld",&b1,&b2,&b3,&o1,&o2,&o3);
q.push_back(make_pair(make_tuple(o1,o2,o3),0));
while(s.size() < b3+1 && !q.empty())
{
auto [t,od] = *(q.begin());
q.pop_front();
policz(t,od);
}
for(int i=0;i<=b3;i++)
{
auto it = s.find(i);
if(it!=s.end()) printf("%lld ",it->second);
else printf("-1 ");
}
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 | #include <iostream> #include <algorithm> #include <stdio.h> #include <set> #include <vector> #include <map> #include <tuple> #include <deque> using namespace std; #define LL long long LL b1,b2,b3,o1,o2,o3; set<tuple<LL,LL,LL>> odw; deque<pair<tuple<LL,LL,LL>,LL>> q; LL odl=0; map<LL,LL> s; LL zostalo(LL o1, LL o2, LL b) { if(o1+o2>b) return o1+o2-b; return 0; } LL przelane(LL o1, LL o2, LL b) { if(o1+o2>b) return b; return o1+o2; } void policz(tuple<LL,LL,LL> t, LL odl) { //printf("policz %lld %lld %lld odl %lld\n",get<0>(t),get<1>(t),get<2>(t),odl); if(odw.find(t) != odw.end()) return; odw.insert(t); auto [o1,o2,o3] = t; if(s.find(o1) == s.end()) s[o1]=odl; if(s.find(o2) == s.end()) s[o2]=odl; if(s.find(o3) == s.end()) s[o3]=odl; q.push_back(make_pair(make_tuple(zostalo(o1,o2,b2),przelane(o1,o2,b2),o3),odl+1)); q.push_back(make_pair(make_tuple(zostalo(o1,o3,b3),o2,przelane(o1,o3,b3)),odl+1)); q.push_back(make_pair(make_tuple(o1,zostalo(o2,o3,b3),przelane(o2,o3,b3)),odl+1)); q.push_back(make_pair(make_tuple(przelane(o2,o1,b1),zostalo(o2,o1,b1),o3),odl+1)); q.push_back(make_pair(make_tuple(o1,przelane(o3,o2,b2),zostalo(o3,o2,b2)),odl+1)); q.push_back(make_pair(make_tuple(przelane(o3,o1,b1),o2,zostalo(o3,o1,b1)),odl+1)); } int main() { scanf("%lld%lld%lld%lld%lld%lld",&b1,&b2,&b3,&o1,&o2,&o3); q.push_back(make_pair(make_tuple(o1,o2,o3),0)); while(s.size() < b3+1 && !q.empty()) { auto [t,od] = *(q.begin()); q.pop_front(); policz(t,od); } for(int i=0;i<=b3;i++) { auto it = s.find(i); if(it!=s.end()) printf("%lld ",it->second); else printf("-1 "); } return 0; } |
English