#include <cstdio>
#include <set>
#include <vector>
typedef long long LL;
const int MAXN = 100000 + 1;
const int INF = (LL(1) << 31) - 1;
using namespace std;
int a[3];
set<vector<int>> visited;
vector<int> g(vector<int> v, int i, int j) {
int d = min(v[i], a[j] - v[j]);
v[i] -= d;
v[j] += d;
return v;
}
int res[MAXN];
int main() {
vector<int> v(3);
for (int i = 0; i < 3; i++) scanf("%d", &a[i]);
for (int i = 0; i < 3; i++) scanf("%d", &v[i]);
for (int i = 0; i <= a[2]; i++) res[i] = INF;
vector<vector<int>> q;
int d = 0;
q.push_back(v);
while (!q.empty()) {
vector<vector<int>> q2;
q2.clear();
for (auto it = q.begin(); it != q.end(); it++) {
for (auto it2 = it->begin(); it2 != it->end(); it2++)
res[*it2] = min(res[*it2], d);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) continue;
auto v2 = g(*it, i, j);
if (visited.find(v2) != visited.end()) continue;
visited.insert(v2);
q2.push_back(v2);
}
}
}
swap(q, q2);
d++;
}
for (int i = 0; i <= a[2]; i++) {
if (res[i] == INF) res[i] = -1;
printf("%d ", res[i]);
}
printf("\n");
}
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 | #include <cstdio> #include <set> #include <vector> typedef long long LL; const int MAXN = 100000 + 1; const int INF = (LL(1) << 31) - 1; using namespace std; int a[3]; set<vector<int>> visited; vector<int> g(vector<int> v, int i, int j) { int d = min(v[i], a[j] - v[j]); v[i] -= d; v[j] += d; return v; } int res[MAXN]; int main() { vector<int> v(3); for (int i = 0; i < 3; i++) scanf("%d", &a[i]); for (int i = 0; i < 3; i++) scanf("%d", &v[i]); for (int i = 0; i <= a[2]; i++) res[i] = INF; vector<vector<int>> q; int d = 0; q.push_back(v); while (!q.empty()) { vector<vector<int>> q2; q2.clear(); for (auto it = q.begin(); it != q.end(); it++) { for (auto it2 = it->begin(); it2 != it->end(); it2++) res[*it2] = min(res[*it2], d); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) continue; auto v2 = g(*it, i, j); if (visited.find(v2) != visited.end()) continue; visited.insert(v2); q2.push_back(v2); } } } swap(q, q2); d++; } for (int i = 0; i <= a[2]; i++) { if (res[i] == INF) res[i] = -1; printf("%d ", res[i]); } printf("\n"); } |
English