#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
#include <set>
using namespace std;
typedef pair<int, int> P;
typedef pair<P, int> T;
struct State : public T {
State(int a, int b, int c, int N) : T{P{a,b},c}, cnt{N} {}
int cnt;
int a() const { return first.first; }
int b() const { return first.second; }
int c() const { return second; }
};
int main() {
ios_base::sync_with_stdio(false);
int A, B, C;
cin >> A;
cin >> B;
cin >> C;
int a, b, c;
cin >> a;
cin >> b;
cin >> c;
vector<int> v(C+1, -1);
set<T> s;
queue<State> q;
auto xfer = [](int a, int B, int b) {
if (B - b >= a) return a;
else return (B - b);
};
int globalcnt = 0;
q.push(State(a, b, c, 0));
while (!q.empty() && globalcnt < C+1) {
auto check = [&v, &globalcnt](int a, int cnt) {
if (v[a] == -1) {
v[a] = cnt;
globalcnt++;
}
};
auto next = q.front();
check(next.a(), next.cnt);
check(next.b(), next.cnt);
check(next.c(), next.cnt);
q.pop();
auto handle = [&s, &q](const State &old, int la, int lb, int lc) {
State nstate{old.a()+la, old.b()+lb, old.c()+lc, old.cnt+1};
auto it = s.find(nstate);
if (it == s.end()) {
q.push(nstate);
s.insert(nstate);
}
};
int l = xfer(next.a(), B, next.b());
handle(next, -l, l, 0);
l = xfer(next.a(), C, next.c());
handle(next, -l, 0, l);
l = xfer(next.b(), A, next.a());
handle(next, l, -l, 0);
l = xfer(next.b(), C, next.c());
handle(next, 0, -l, l);
l = xfer(next.c(), A, next.a());
handle(next, l, 0, -l);
l = xfer(next.c(), B, next.b());
handle(next, 0, l, -l);
}
for (auto i: v)
cout << 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 | #include <iostream> #include <vector> #include <queue> #include <tuple> #include <set> using namespace std; typedef pair<int, int> P; typedef pair<P, int> T; struct State : public T { State(int a, int b, int c, int N) : T{P{a,b},c}, cnt{N} {} int cnt; int a() const { return first.first; } int b() const { return first.second; } int c() const { return second; } }; int main() { ios_base::sync_with_stdio(false); int A, B, C; cin >> A; cin >> B; cin >> C; int a, b, c; cin >> a; cin >> b; cin >> c; vector<int> v(C+1, -1); set<T> s; queue<State> q; auto xfer = [](int a, int B, int b) { if (B - b >= a) return a; else return (B - b); }; int globalcnt = 0; q.push(State(a, b, c, 0)); while (!q.empty() && globalcnt < C+1) { auto check = [&v, &globalcnt](int a, int cnt) { if (v[a] == -1) { v[a] = cnt; globalcnt++; } }; auto next = q.front(); check(next.a(), next.cnt); check(next.b(), next.cnt); check(next.c(), next.cnt); q.pop(); auto handle = [&s, &q](const State &old, int la, int lb, int lc) { State nstate{old.a()+la, old.b()+lb, old.c()+lc, old.cnt+1}; auto it = s.find(nstate); if (it == s.end()) { q.push(nstate); s.insert(nstate); } }; int l = xfer(next.a(), B, next.b()); handle(next, -l, l, 0); l = xfer(next.a(), C, next.c()); handle(next, -l, 0, l); l = xfer(next.b(), A, next.a()); handle(next, l, -l, 0); l = xfer(next.b(), C, next.c()); handle(next, 0, -l, l); l = xfer(next.c(), A, next.a()); handle(next, l, 0, -l); l = xfer(next.c(), B, next.b()); handle(next, 0, l, -l); } for (auto i: v) cout << i << " "; cout << endl; return 0; } |
English