#include <cstdio> #include <queue> #include <set> using namespace std; int A,B,C; const int maxN = 1e5+10; int ans[maxN]; struct XD { int a, b, c, ansXD; XD(int a, int b, int c, int ansXD) : a(a), b(b), c(c), ansXD(ansXD) {} void set_ans() { if(!ans[a]) ans[a]=ansXD; if(!ans[b]) ans[b]=ansXD; if(!ans[c]) ans[c]=ansXD; } long long xDll() { return a + b * 1LL * maxN + c * 1LL * maxN * 1LL * maxN; } }; set<long long> S; queue<XD> k; int ansXD; void try_adding_XDDD(int a, int b, int c) { XD xD(a,b,c,ansXD); if(S.find(xD.xDll()) != S.end()) return; S.insert(xD.xDll()); k.emplace(a, b, c, ansXD); } void bfs(int sa, int sb, int sc) { k.emplace(sa, sb, sc, 1); S.insert(k.front().xDll()); ans[sa] = ans[sb] = ans[sc]; while(!k.empty()) { XD xD = k.front(); xD.set_ans(); ansXD = xD.ansXD+1; k.pop(); int xd = min(B-xD.b, xD.a); try_adding_XDDD(xD.a-xd, xD.b+xd, xD.c); xd=min(xD.b, A-xD.a); try_adding_XDDD(xD.a+xd, xD.b-xd, xD.c); xd=min(xD.b, C-xD.c); try_adding_XDDD(xD.a, xD.b-xd, xD.c+xd); xd=min(B-xD.b, xD.c); try_adding_XDDD(xD.a, xD.b+xd, xD.c-xd); xd=min(A-xD.a, xD.c); try_adding_XDDD(xD.a+xd, xD.b, xD.c-xd); xd=min(xD.a, C-xD.c); try_adding_XDDD(xD.a-xd, xD.b, xD.c+xd); } } int main() { scanf("%d%d%d", &A, &B, &C); int a, b, c; scanf("%d%d%d", &a, &b, &c); bfs(a, b, c); for(int i=0; i<=C; ++i) printf("%d ", ans[i]-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 <cstdio> #include <queue> #include <set> using namespace std; int A,B,C; const int maxN = 1e5+10; int ans[maxN]; struct XD { int a, b, c, ansXD; XD(int a, int b, int c, int ansXD) : a(a), b(b), c(c), ansXD(ansXD) {} void set_ans() { if(!ans[a]) ans[a]=ansXD; if(!ans[b]) ans[b]=ansXD; if(!ans[c]) ans[c]=ansXD; } long long xDll() { return a + b * 1LL * maxN + c * 1LL * maxN * 1LL * maxN; } }; set<long long> S; queue<XD> k; int ansXD; void try_adding_XDDD(int a, int b, int c) { XD xD(a,b,c,ansXD); if(S.find(xD.xDll()) != S.end()) return; S.insert(xD.xDll()); k.emplace(a, b, c, ansXD); } void bfs(int sa, int sb, int sc) { k.emplace(sa, sb, sc, 1); S.insert(k.front().xDll()); ans[sa] = ans[sb] = ans[sc]; while(!k.empty()) { XD xD = k.front(); xD.set_ans(); ansXD = xD.ansXD+1; k.pop(); int xd = min(B-xD.b, xD.a); try_adding_XDDD(xD.a-xd, xD.b+xd, xD.c); xd=min(xD.b, A-xD.a); try_adding_XDDD(xD.a+xd, xD.b-xd, xD.c); xd=min(xD.b, C-xD.c); try_adding_XDDD(xD.a, xD.b-xd, xD.c+xd); xd=min(B-xD.b, xD.c); try_adding_XDDD(xD.a, xD.b+xd, xD.c-xd); xd=min(A-xD.a, xD.c); try_adding_XDDD(xD.a+xd, xD.b, xD.c-xd); xd=min(xD.a, C-xD.c); try_adding_XDDD(xD.a-xd, xD.b, xD.c+xd); } } int main() { scanf("%d%d%d", &A, &B, &C); int a, b, c; scanf("%d%d%d", &a, &b, &c); bfs(a, b, c); for(int i=0; i<=C; ++i) printf("%d ", ans[i]-1); return 0; } |