#include <cstdio> #include <cstring> #include <queue> #include <unordered_set> #include <utility> struct State { int a, b, c; bool operator==(const State &other) const { return (a == other.a && b == other.b && c == other.c); } } maxes; struct StateHasher { std::size_t operator()(const State &t) const { size_t res = 17; res = res * 31 + t.a; res = res * 31 + t.b; res = res * 31 + t.c; return res; } }; inline int _min(int a, int b) { return (a < b) ? a : b; } inline int _max(int a, int b) { return (a > b) ? a : b; } const int NN = 100100; int found = 0; int all; int dists[NN]; std::unordered_set<State, StateHasher> hash; std::queue<std::pair<State, int>> queue; inline bool update(int v, int dist) { if (dists[v] == 0) { dists[v] = dist; return ++found == all; } return false; } inline void try_put(int tr, State s1, int dist) { if (tr && hash.find(s1) == hash.end()) { hash.insert(s1); queue.push({s1, dist}); } } int main() { memset(dists, 0, NN); State start; scanf("%d%d%d", &maxes.a, &maxes.b, &maxes.c); scanf("%d%d%d", &start.a, &start.b, &start.c); all = maxes.c + 1; hash.insert(start); queue.push({start, 0}); int tr; while (!queue.empty()) { auto elem = queue.front(); queue.pop(); State s = elem.first; State s1; int dist = elem.second + 1; if (update(s.a, dist)) break; if (update(s.b, dist)) break; if (update(s.c, dist)) break; tr = _min(s.a, maxes.b - s.b); try_put(tr, {s.a - tr, s.b + tr, s.c}, dist); tr = _min(s.a, maxes.c - s.c); try_put(tr, {s.a - tr, s.b, s.c + tr}, dist); tr = _min(s.b, maxes.a - s.a); try_put(tr, {s.a + tr, s.b - tr, s.c}, dist); tr = _min(s.b, maxes.c - s.c); try_put(tr, {s.a, s.b - tr, s.c + tr}, dist); tr = _min(s.c, maxes.a - s.a); try_put(tr, {s.a + tr, s.b, s.c - tr}, dist); tr = _min(s.c, maxes.b - s.b); try_put(tr, {s.a, s.b + tr, s.c - tr}, dist); } for (int i = 0; i < all; ++i) { printf("%d ", dists[i] - 1); } printf("\n"); 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 | #include <cstdio> #include <cstring> #include <queue> #include <unordered_set> #include <utility> struct State { int a, b, c; bool operator==(const State &other) const { return (a == other.a && b == other.b && c == other.c); } } maxes; struct StateHasher { std::size_t operator()(const State &t) const { size_t res = 17; res = res * 31 + t.a; res = res * 31 + t.b; res = res * 31 + t.c; return res; } }; inline int _min(int a, int b) { return (a < b) ? a : b; } inline int _max(int a, int b) { return (a > b) ? a : b; } const int NN = 100100; int found = 0; int all; int dists[NN]; std::unordered_set<State, StateHasher> hash; std::queue<std::pair<State, int>> queue; inline bool update(int v, int dist) { if (dists[v] == 0) { dists[v] = dist; return ++found == all; } return false; } inline void try_put(int tr, State s1, int dist) { if (tr && hash.find(s1) == hash.end()) { hash.insert(s1); queue.push({s1, dist}); } } int main() { memset(dists, 0, NN); State start; scanf("%d%d%d", &maxes.a, &maxes.b, &maxes.c); scanf("%d%d%d", &start.a, &start.b, &start.c); all = maxes.c + 1; hash.insert(start); queue.push({start, 0}); int tr; while (!queue.empty()) { auto elem = queue.front(); queue.pop(); State s = elem.first; State s1; int dist = elem.second + 1; if (update(s.a, dist)) break; if (update(s.b, dist)) break; if (update(s.c, dist)) break; tr = _min(s.a, maxes.b - s.b); try_put(tr, {s.a - tr, s.b + tr, s.c}, dist); tr = _min(s.a, maxes.c - s.c); try_put(tr, {s.a - tr, s.b, s.c + tr}, dist); tr = _min(s.b, maxes.a - s.a); try_put(tr, {s.a + tr, s.b - tr, s.c}, dist); tr = _min(s.b, maxes.c - s.c); try_put(tr, {s.a, s.b - tr, s.c + tr}, dist); tr = _min(s.c, maxes.a - s.a); try_put(tr, {s.a + tr, s.b, s.c - tr}, dist); tr = _min(s.c, maxes.b - s.b); try_put(tr, {s.a, s.b + tr, s.c - tr}, dist); } for (int i = 0; i < all; ++i) { printf("%d ", dists[i] - 1); } printf("\n"); return 0; } |