#include <iostream>
#include <tuple>
#include <set>
#include <vector>
#include <queue>
using namespace std;
set<tuple<int,int,int>> sym_opcji(int A, int B, int C, int a, int b, int c) {
set<tuple<int,int,int>> res;
// dodanie do A
if (a + b > A) {
res.emplace(A, a+b - A, c);
} else {
res.emplace(a + b, 0, c);
}
// dokad + skad > dokad
if ( a + c > A){
res.emplace(A, b, a + c - A);
} else {
res.emplace(a + c, b, 0);
}
if (b + a > B) {
res.emplace(a + b - B, B, c);
} else {
res.emplace(0, a + b, c);
}
if ( b + c > B){
res.emplace(a, B, b + c - B);
} else {
res.emplace(a, b + c, 0);
}
if (c + a > C) {
res.emplace(a + c - C, b, C);
} else {
res.emplace(0, b, c + a);
}
if ( c + b > C){
res.emplace(a, b + c - C, C);
} else {
res.emplace(a, 0, b + c);
}
return res;
}
void bfs(vector<int>& result, int A, int B, int C, int a, int b, int c) {
queue<tuple<int, int ,int>> done;
done.push({a,b,c});
set<tuple<int,int,int>> seen;
queue<int> q;
int how_many_act_layer = 1;
int how_many_next_layer = 0;
seen.insert(done.front());
int step = 0;
int how_many_do_we_have = 0;
tuple<int,int,int> act_val;
while (!done.empty() && how_many_do_we_have <= C) {
auto [l,m,n] = done.front();
// cout << l << " " << m << " " << n << " " << step <<'\n';
done.pop();
seen.insert({l,m,n});
if (result[l] == -1) {
how_many_do_we_have++;
result[l] = step;
}
if (result[m] == -1) {
how_many_do_we_have++;
result[m] = step;
}
if (result[n] == -1) {
how_many_do_we_have++;
result[n] = step;
}
how_many_act_layer--;
int temp = 0;
auto options = sym_opcji(A,B,C,l,m,n);
for (auto possibility: options) {
if (seen.find(possibility) == seen.end()) {
temp++;
done.push(possibility);
}
}
if (how_many_act_layer == 0) {
step++;
how_many_act_layer = how_many_next_layer + temp;
how_many_next_layer = 0;
} else {
how_many_next_layer += temp;
}
}
// cout << "how" << how_many_do_we_have;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int A, B, C, a, b, c;
cin >> A >> B >> C >> a >> b >> c;
// auto o = sym_opcji(A, B, C, 2, 5, 3);
// for (auto [l,k,m]: o) {
// cout << l << " " << k << " " << m << '\n';
// }
vector<int> res(C + 1, -1);
bfs(res, A,B,C,a,b,c);
for (int i =0; i < C + 1; ++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 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <iostream> #include <tuple> #include <set> #include <vector> #include <queue> using namespace std; set<tuple<int,int,int>> sym_opcji(int A, int B, int C, int a, int b, int c) { set<tuple<int,int,int>> res; // dodanie do A if (a + b > A) { res.emplace(A, a+b - A, c); } else { res.emplace(a + b, 0, c); } // dokad + skad > dokad if ( a + c > A){ res.emplace(A, b, a + c - A); } else { res.emplace(a + c, b, 0); } if (b + a > B) { res.emplace(a + b - B, B, c); } else { res.emplace(0, a + b, c); } if ( b + c > B){ res.emplace(a, B, b + c - B); } else { res.emplace(a, b + c, 0); } if (c + a > C) { res.emplace(a + c - C, b, C); } else { res.emplace(0, b, c + a); } if ( c + b > C){ res.emplace(a, b + c - C, C); } else { res.emplace(a, 0, b + c); } return res; } void bfs(vector<int>& result, int A, int B, int C, int a, int b, int c) { queue<tuple<int, int ,int>> done; done.push({a,b,c}); set<tuple<int,int,int>> seen; queue<int> q; int how_many_act_layer = 1; int how_many_next_layer = 0; seen.insert(done.front()); int step = 0; int how_many_do_we_have = 0; tuple<int,int,int> act_val; while (!done.empty() && how_many_do_we_have <= C) { auto [l,m,n] = done.front(); // cout << l << " " << m << " " << n << " " << step <<'\n'; done.pop(); seen.insert({l,m,n}); if (result[l] == -1) { how_many_do_we_have++; result[l] = step; } if (result[m] == -1) { how_many_do_we_have++; result[m] = step; } if (result[n] == -1) { how_many_do_we_have++; result[n] = step; } how_many_act_layer--; int temp = 0; auto options = sym_opcji(A,B,C,l,m,n); for (auto possibility: options) { if (seen.find(possibility) == seen.end()) { temp++; done.push(possibility); } } if (how_many_act_layer == 0) { step++; how_many_act_layer = how_many_next_layer + temp; how_many_next_layer = 0; } else { how_many_next_layer += temp; } } // cout << "how" << how_many_do_we_have; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int A, B, C, a, b, c; cin >> A >> B >> C >> a >> b >> c; // auto o = sym_opcji(A, B, C, 2, 5, 3); // for (auto [l,k,m]: o) { // cout << l << " " << k << " " << m << '\n'; // } vector<int> res(C + 1, -1); bfs(res, A,B,C,a,b,c); for (int i =0; i < C + 1; ++i) { cout << res[i] << " "; } } |
English