#include <cstdio> #include <unordered_map> #include <queue> #include <algorithm> #define BASE 300010ll #define INF 1000000000 using namespace std; unordered_map<long long, int> odl; queue<pair<int, pair<int, int> >> q; int wyn[BASE]; long long serialize(long long a, long long b, long long c) { return a * BASE * BASE + b * BASE + c; } int ac, bc, cc; int al, bl, cl; int sumL; void consider(int A, int B, int C, int o) { auto s = serialize(A, B, C); if (odl.find(s) == odl.end()) { odl.insert(make_pair(s, o)); q.push(make_pair(A, make_pair(B, C))); } } int main() { scanf("%d%d%d", &ac, &bc, &cc); scanf("%d%d%d", &al, &bl, &cl); sumL = al + bl + cl; for (int i = 0; i <= cc; i++) { wyn[i] = INF; } q.push(make_pair(al, make_pair(bl, cl))); odl[serialize(al, bl, cl)] = 0; while (!q.empty()) { auto x = q.front(); q.pop(); int A = x.first; int B = x.second.first; int C = x.second.second; int o = odl[serialize(A, B, C)]; wyn[A] = min(wyn[A], o); wyn[B] = min(wyn[B], o); wyn[C] = min(wyn[C], o); // A to B if (A > bc - B) consider(sumL - bc - C, bc, C, o + 1); else consider(0, sumL - C, C, o + 1); // A to C if (A > cc - C) consider(sumL - cc - B, B, cc, o + 1); else consider(0, B, sumL - B, o + 1); // B to A if (B > ac - A) consider(ac, sumL - ac - C, C, o + 1); else consider(sumL - C, 0, C, o + 1); // B to C if (B > cc - C) consider(A, sumL - cc - A, cc, o + 1); else consider(A, 0, sumL - A, o + 1); // C to A if (C > ac - A) consider(ac, B, sumL - ac - B, o + 1); else consider(sumL - B, B, 0, o + 1); // C to B if (C > bc - B) consider(A, bc, sumL - bc - A, o + 1); else consider(A, sumL - A, 0, o + 1); } for (int i = 0; i <= cc; i++) { printf("%d ", wyn[i] == INF ? -1 : wyn[i]); } printf("\n"); }
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 | #include <cstdio> #include <unordered_map> #include <queue> #include <algorithm> #define BASE 300010ll #define INF 1000000000 using namespace std; unordered_map<long long, int> odl; queue<pair<int, pair<int, int> >> q; int wyn[BASE]; long long serialize(long long a, long long b, long long c) { return a * BASE * BASE + b * BASE + c; } int ac, bc, cc; int al, bl, cl; int sumL; void consider(int A, int B, int C, int o) { auto s = serialize(A, B, C); if (odl.find(s) == odl.end()) { odl.insert(make_pair(s, o)); q.push(make_pair(A, make_pair(B, C))); } } int main() { scanf("%d%d%d", &ac, &bc, &cc); scanf("%d%d%d", &al, &bl, &cl); sumL = al + bl + cl; for (int i = 0; i <= cc; i++) { wyn[i] = INF; } q.push(make_pair(al, make_pair(bl, cl))); odl[serialize(al, bl, cl)] = 0; while (!q.empty()) { auto x = q.front(); q.pop(); int A = x.first; int B = x.second.first; int C = x.second.second; int o = odl[serialize(A, B, C)]; wyn[A] = min(wyn[A], o); wyn[B] = min(wyn[B], o); wyn[C] = min(wyn[C], o); // A to B if (A > bc - B) consider(sumL - bc - C, bc, C, o + 1); else consider(0, sumL - C, C, o + 1); // A to C if (A > cc - C) consider(sumL - cc - B, B, cc, o + 1); else consider(0, B, sumL - B, o + 1); // B to A if (B > ac - A) consider(ac, sumL - ac - C, C, o + 1); else consider(sumL - C, 0, C, o + 1); // B to C if (B > cc - C) consider(A, sumL - cc - A, cc, o + 1); else consider(A, 0, sumL - A, o + 1); // C to A if (C > ac - A) consider(ac, B, sumL - ac - B, o + 1); else consider(sumL - B, B, 0, o + 1); // C to B if (C > bc - B) consider(A, bc, sumL - bc - A, o + 1); else consider(A, sumL - A, 0, o + 1); } for (int i = 0; i <= cc; i++) { printf("%d ", wyn[i] == INF ? -1 : wyn[i]); } printf("\n"); } |