#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 3*2*100'002;
inline ll vec_to_ll (vector<int> &v) {
return v[0] + (((ll) v[1] + ((ll) v[2] << 20)) << 20);
}
int main() {
vector<int> vol(3);
vector<int> start(3);
for (int i=0; i<3; ++i)
cin >> vol[i];
for (int i=0; i<3; ++i)
cin >> start[i];
queue<pair<vector<int>, int>> q;
unordered_set<ll> visited;
vector<int> num_steps (vol[2]+1, INF);
q.push({start, 0});
visited.insert(vec_to_ll(start));
while (!q.empty()) {
auto [v, steps] = q.front();
for (auto x : v)
num_steps[x] = min(num_steps[x], steps);
q.pop();
for (int i=0; i<3; ++i)
for (int j=0; j<3; ++j)
if (i != j) {
// przelewamy i -> j
vector<int> w = v;
int x = min(v[i], vol[j] - v[j]);
w[j] += x;
w[i] -= x;
if (visited.count(vec_to_ll(w)) == 0) {
visited.insert(vec_to_ll(w));
q.push({w, steps+1});
}
}
}
for (auto i : num_steps)
cout << (i < INF ? 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 | #include <bits/stdc++.h> using namespace std; #define ll long long const int INF = 3*2*100'002; inline ll vec_to_ll (vector<int> &v) { return v[0] + (((ll) v[1] + ((ll) v[2] << 20)) << 20); } int main() { vector<int> vol(3); vector<int> start(3); for (int i=0; i<3; ++i) cin >> vol[i]; for (int i=0; i<3; ++i) cin >> start[i]; queue<pair<vector<int>, int>> q; unordered_set<ll> visited; vector<int> num_steps (vol[2]+1, INF); q.push({start, 0}); visited.insert(vec_to_ll(start)); while (!q.empty()) { auto [v, steps] = q.front(); for (auto x : v) num_steps[x] = min(num_steps[x], steps); q.pop(); for (int i=0; i<3; ++i) for (int j=0; j<3; ++j) if (i != j) { // przelewamy i -> j vector<int> w = v; int x = min(v[i], vol[j] - v[j]); w[j] += x; w[i] -= x; if (visited.count(vec_to_ll(w)) == 0) { visited.insert(vec_to_ll(w)); q.push({w, steps+1}); } } } for (auto i : num_steps) cout << (i < INF ? i : -1 ) << " "; return 0; } |
English