#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
#define st first
#define nd second.first
#define rd second.second
typedef pair<int,int> pun;
typedef long long ll;
int inf = 1<<28;
int A, B, C;
vector<int> v;
int left_n;
typedef pair<int,pair<int,int>> tri;
map<tri, int> mem;
queue<tri> que;
void ch(int a, int x) {
if (v[a] == inf) left_n --;
v[a] = min(v[a], x);
}
vector<tri> generate(int a, int b, int c) {
vector<tri> res;
int x = min(A, a + b) - a;
res.push_back({a + x, {b - x, c}});
x = min(A, a + c) - a;
res.push_back({a + x, {b, c - x}});
x = min(B, a + b) - b;
res.push_back({a - x, {b + x, c}});
x = min(B, b + c) - b;
res.push_back({a, {b + x, c - x}});
x = min(C, a + c) - c;
res.push_back({a - x, {b, c + x}});
x = min(C, b + c) - c;
res.push_back({a, {b - x, c + x}});
return res;
}
void solve(int a, int b, int c) {
que.push({a, {b, c}});
left_n = C + 1;
while (!que.empty() && left_n > 0) {
a = que.front().st;
b = que.front().nd;
c = que.front().rd;
int x = mem[que.front()];
ch(a, x);
ch(b, x);
ch(c, x);
que.pop();
vector<tri> moves = generate(a, b, c);
for (auto t : moves) {
if (mem.count(t) == 0) {
mem[t] = x + 1;
que.push(t);
}
}
}
}
int main() {
int a, b, c;
cin >> A >> B >> C >> a >> b >> c;
v.resize(C+1, inf);
solve(a, b, c);
for (int x : v) {
cout << (x == inf ? -1 : x) << " ";
}
}
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 | #include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; #define st first #define nd second.first #define rd second.second typedef pair<int,int> pun; typedef long long ll; int inf = 1<<28; int A, B, C; vector<int> v; int left_n; typedef pair<int,pair<int,int>> tri; map<tri, int> mem; queue<tri> que; void ch(int a, int x) { if (v[a] == inf) left_n --; v[a] = min(v[a], x); } vector<tri> generate(int a, int b, int c) { vector<tri> res; int x = min(A, a + b) - a; res.push_back({a + x, {b - x, c}}); x = min(A, a + c) - a; res.push_back({a + x, {b, c - x}}); x = min(B, a + b) - b; res.push_back({a - x, {b + x, c}}); x = min(B, b + c) - b; res.push_back({a, {b + x, c - x}}); x = min(C, a + c) - c; res.push_back({a - x, {b, c + x}}); x = min(C, b + c) - c; res.push_back({a, {b - x, c + x}}); return res; } void solve(int a, int b, int c) { que.push({a, {b, c}}); left_n = C + 1; while (!que.empty() && left_n > 0) { a = que.front().st; b = que.front().nd; c = que.front().rd; int x = mem[que.front()]; ch(a, x); ch(b, x); ch(c, x); que.pop(); vector<tri> moves = generate(a, b, c); for (auto t : moves) { if (mem.count(t) == 0) { mem[t] = x + 1; que.push(t); } } } } int main() { int a, b, c; cin >> A >> B >> C >> a >> b >> c; v.resize(C+1, inf); solve(a, b, c); for (int x : v) { cout << (x == inf ? -1 : x) << " "; } } |
English