#include <bits/stdc++.h> using namespace std; long long MAX_VALUE = 100001; set<long long> visited; long long *result; long long A, B, C; void nextSteps(int a1, int b1, int c1) { queue<pair<int, int>> toVisit; long long sum = a1 + b1 + c1; toVisit.push({a1, b1}); int counter = 0; while (!toVisit.empty()) { queue<pair<int, int>> toVisitTmp; while (!toVisit.empty()) { pair<int, int> nextSetup = toVisit.front(); toVisit.pop(); long long a = nextSetup.first; long long b = nextSetup.second; long long c = sum - a - b; if(visited.count(a*MAX_VALUE + b) == 1) continue; visited.insert(a*MAX_VALUE + b); result[a] = result[a] == -1 ? counter : result[a]; result[b] = result[b] == -1 ? counter : result[b]; result[c] = result[c] == -1 ? counter : result[c]; if(a > 0 and b < B){ if(B - b >= a) { toVisitTmp.push({0, b + a}); } else { toVisitTmp.push({a - B + b, B}); } } if (a > 0 and c < C) { if(C - c >= a) { toVisitTmp.push({0, b}); } else { toVisitTmp.push({a - C + c, b}); } } if (b > 0 and a < A) { if(A - a >= b) { toVisitTmp.push({a + b, 0}); } else { toVisitTmp.push({A, b - A + a}); } } if (b > 0 and c < C) { if(C - c >= b) { toVisitTmp.push({a, 0}); } else { toVisitTmp.push({a, b - C + c}); } } if (c > 0 and a < A) { if(A - a >= c) { toVisitTmp.push({a + c, b}); } else { toVisitTmp.push({A, b}); } } if(c > 0 and b < B) { if(B - b >= c) { toVisitTmp.push({a, b + c}); } else { toVisitTmp.push({a, B}); } } } toVisit = toVisitTmp; counter++; } } int main() { std::ios_base::sync_with_stdio(false); cin >> A >> B >> C; int a, b, c; cin >> a >> b >> c; result = new long long[C+1]; for(int i = 0; i < C+1; i++) result[i] = -1; nextSteps(a, b, c); for(int i = 0; i < C + 1; i++) cout<<result[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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <bits/stdc++.h> using namespace std; long long MAX_VALUE = 100001; set<long long> visited; long long *result; long long A, B, C; void nextSteps(int a1, int b1, int c1) { queue<pair<int, int>> toVisit; long long sum = a1 + b1 + c1; toVisit.push({a1, b1}); int counter = 0; while (!toVisit.empty()) { queue<pair<int, int>> toVisitTmp; while (!toVisit.empty()) { pair<int, int> nextSetup = toVisit.front(); toVisit.pop(); long long a = nextSetup.first; long long b = nextSetup.second; long long c = sum - a - b; if(visited.count(a*MAX_VALUE + b) == 1) continue; visited.insert(a*MAX_VALUE + b); result[a] = result[a] == -1 ? counter : result[a]; result[b] = result[b] == -1 ? counter : result[b]; result[c] = result[c] == -1 ? counter : result[c]; if(a > 0 and b < B){ if(B - b >= a) { toVisitTmp.push({0, b + a}); } else { toVisitTmp.push({a - B + b, B}); } } if (a > 0 and c < C) { if(C - c >= a) { toVisitTmp.push({0, b}); } else { toVisitTmp.push({a - C + c, b}); } } if (b > 0 and a < A) { if(A - a >= b) { toVisitTmp.push({a + b, 0}); } else { toVisitTmp.push({A, b - A + a}); } } if (b > 0 and c < C) { if(C - c >= b) { toVisitTmp.push({a, 0}); } else { toVisitTmp.push({a, b - C + c}); } } if (c > 0 and a < A) { if(A - a >= c) { toVisitTmp.push({a + c, b}); } else { toVisitTmp.push({A, b}); } } if(c > 0 and b < B) { if(B - b >= c) { toVisitTmp.push({a, b + c}); } else { toVisitTmp.push({a, B}); } } } toVisit = toVisitTmp; counter++; } } int main() { std::ios_base::sync_with_stdio(false); cin >> A >> B >> C; int a, b, c; cin >> a >> b >> c; result = new long long[C+1]; for(int i = 0; i < C+1; i++) result[i] = -1; nextSteps(a, b, c); for(int i = 0; i < C + 1; i++) cout<<result[i]<<" "; cout<<endl; return 0; } |