#include<bits/stdc++.h> using namespace std; map<pair<int, int>, bool> czy; queue<pair<int, int>> kolejka; int odp[100010]; int main() { int A, B, C, a, b, c; scanf("%d%d%d%d%d%d", &A, &B, &C, &a, &b, &c); czy[{a,b}]=1; for(int i=0;i<C+1;i++) if(i!=a && i!=b && i!=c) odp[i]=1000000007; kolejka.push({a,b}); int t=0; while(kolejka.size()!=0) { t++; int d = kolejka.size(); while(d--) { int a1=kolejka.front().first, b1=kolejka.front().second, c1=a+b+c-a1-b1; int a2, b2, c2; kolejka.pop(); //a -> b c2=c1; a2=a1-min(B-b1, a1); b2=b1+min(B-b1, a1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //a->c b2=b1; a2=a1-min(C-c1, a1); c2=c1+min(C-c1, a1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //b->a c2=c1; a2=a1+min(A-a1, b1); b2=b1-min(A-a1, b1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //b->c a2=a1; b2=b1-min(C-c1, b1); c2=c1+min(C-c1, b1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //c->a b2=b1; a2=a1+min(A-a1, c1); c2=c1-min(A-a1, c1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //c->b a2=a1; c2=c1-min(B-b1, c1); b2=b1+min(B-b1, c1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } } } for(int i=0;i<=C;i++) { if(odp[i]==1000000007) printf("-1 "); else printf("%d ", odp[i]); } }
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include<bits/stdc++.h> using namespace std; map<pair<int, int>, bool> czy; queue<pair<int, int>> kolejka; int odp[100010]; int main() { int A, B, C, a, b, c; scanf("%d%d%d%d%d%d", &A, &B, &C, &a, &b, &c); czy[{a,b}]=1; for(int i=0;i<C+1;i++) if(i!=a && i!=b && i!=c) odp[i]=1000000007; kolejka.push({a,b}); int t=0; while(kolejka.size()!=0) { t++; int d = kolejka.size(); while(d--) { int a1=kolejka.front().first, b1=kolejka.front().second, c1=a+b+c-a1-b1; int a2, b2, c2; kolejka.pop(); //a -> b c2=c1; a2=a1-min(B-b1, a1); b2=b1+min(B-b1, a1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //a->c b2=b1; a2=a1-min(C-c1, a1); c2=c1+min(C-c1, a1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //b->a c2=c1; a2=a1+min(A-a1, b1); b2=b1-min(A-a1, b1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //b->c a2=a1; b2=b1-min(C-c1, b1); c2=c1+min(C-c1, b1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //c->a b2=b1; a2=a1+min(A-a1, c1); c2=c1-min(A-a1, c1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } //c->b a2=a1; c2=c1-min(B-b1, c1); b2=b1+min(B-b1, c1); odp[a2]=min(odp[a2], t); odp[b2]=min(odp[b2], t); odp[c2]=min(odp[c2], t); if(czy[{a2, b2}]==0) { czy[{a2,b2}]=1; kolejka.push({a2, b2}); } } } for(int i=0;i<=C;i++) { if(odp[i]==1000000007) printf("-1 "); else printf("%d ", odp[i]); } } |