#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int x;
int res[100005];
vector<ll> cap, now;
map<ll, int> dist;
ll hasz(vector<ll> &x) {
return x[0] + (x[1] << 20LL) + (x[2] << 40LL);
}
vector<ll> strip(ll x) {
vector<ll> res;
for (int i = 1; i <= 3; i++) {
res.push_back(x & ((1LL << 20LL) - 1));
x >>= 20LL;
}
return res;
}
int32_t main() {
for (int i = 0; i < 3; i++) cin >> x, cap.push_back(x);
for (int i = 0; i < 3; i++) cin >> x, now.push_back(x);
for (int i = 0; i <= cap[2]; i++) res[i] = -1;
for (auto i : now) res[i] = 0;
queue<pair<ll ,int>> q;
q.push({hasz(now), 0});
while (!q.empty()) {
auto now = strip(q.front().first);
int cur_dist = q.front().second;
q.pop();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) continue;
int x = min(now[i], cap[j] - now[j]);
now[i] -= x;
now[j] += x;
ll hugo = hasz(now);
if (!dist.count(hugo)) {
dist[hugo] = cur_dist + 1;
if (res[now[i]] == -1)
res[now[i]] = cur_dist + 1;
if (res[now[j]] == -1)
res[now[j]] = cur_dist + 1;
q.push({hugo, cur_dist + 1});
}
now[i] += x;
now[j] -= x;
}
}
}
for (int i = 0; i <= cap[2]; i++) cout << res[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 | #include <bits/stdc++.h> using namespace std; using ll = long long; int x; int res[100005]; vector<ll> cap, now; map<ll, int> dist; ll hasz(vector<ll> &x) { return x[0] + (x[1] << 20LL) + (x[2] << 40LL); } vector<ll> strip(ll x) { vector<ll> res; for (int i = 1; i <= 3; i++) { res.push_back(x & ((1LL << 20LL) - 1)); x >>= 20LL; } return res; } int32_t main() { for (int i = 0; i < 3; i++) cin >> x, cap.push_back(x); for (int i = 0; i < 3; i++) cin >> x, now.push_back(x); for (int i = 0; i <= cap[2]; i++) res[i] = -1; for (auto i : now) res[i] = 0; queue<pair<ll ,int>> q; q.push({hasz(now), 0}); while (!q.empty()) { auto now = strip(q.front().first); int cur_dist = q.front().second; q.pop(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) continue; int x = min(now[i], cap[j] - now[j]); now[i] -= x; now[j] += x; ll hugo = hasz(now); if (!dist.count(hugo)) { dist[hugo] = cur_dist + 1; if (res[now[i]] == -1) res[now[i]] = cur_dist + 1; if (res[now[j]] == -1) res[now[j]] = cur_dist + 1; q.push({hugo, cur_dist + 1}); } now[i] += x; now[j] -= x; } } } for (int i = 0; i <= cap[2]; i++) cout << res[i] << " "; } |
English