#include <iostream> #include <map> #include <queue> #include <vector> using namespace std; int num_of_steps_to_reach[100005]; vector<pair<int, int>> moves = { {0, 1}, {0, 2}, {1, 2}, {1, 0}, {2, 0}, {2, 1} }; int main() { int a, b, c, n, abc[3], ABC[3], new_abc[3], max_ABC; cin >> ABC[0] >> ABC[1] >> ABC[2]; max_ABC = max(max(ABC[0], ABC[1]), ABC[2]); for(auto i = 0; i <= max_ABC; i++) { num_of_steps_to_reach[i] = -1; } cin >> a >> b >> c; num_of_steps_to_reach[a] = 0; num_of_steps_to_reach[b] = 0; num_of_steps_to_reach[c] = 0; n = a + b + c; queue<pair<pair<int, int>, int>> q; q.push(pair(pair(a, b), 0)); pair<pair<int, int>, int> pos_decants; pair<int, int> aux_pair; map<pair<int, int>, bool> odw; odw[pair(a, b)] = true; int free_space; while(!q.empty()) { pos_decants = q.front(); abc[0] = pos_decants.first.first; abc[1] = pos_decants.first.second; abc[2] = n - abc[0] - abc[1]; for (auto move: moves) { free_space = ABC[move.second] - abc[move.second]; for(auto i = 0; i < 3; i++) { new_abc[i] = abc[i]; } if (abc[move.first] > free_space) { new_abc[move.first] -= free_space; new_abc[move.second] += free_space; } else { new_abc[move.second] += new_abc[move.first]; new_abc[move.first] = 0; } aux_pair = pair(new_abc[0], new_abc[1]); if (odw.find(aux_pair) == odw.end()) { q.push(pair(aux_pair, pos_decants.second + 1)); odw[aux_pair] = true; for(auto i = 0; i < 3; i++) { if (num_of_steps_to_reach[new_abc[i]] == -1) { num_of_steps_to_reach[new_abc[i]] = pos_decants.second + 1; } } } } q.pop(); } for (auto i = 0; i <= ABC[2]; i++) { cout << num_of_steps_to_reach[i] << " "; } 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 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 | #include <iostream> #include <map> #include <queue> #include <vector> using namespace std; int num_of_steps_to_reach[100005]; vector<pair<int, int>> moves = { {0, 1}, {0, 2}, {1, 2}, {1, 0}, {2, 0}, {2, 1} }; int main() { int a, b, c, n, abc[3], ABC[3], new_abc[3], max_ABC; cin >> ABC[0] >> ABC[1] >> ABC[2]; max_ABC = max(max(ABC[0], ABC[1]), ABC[2]); for(auto i = 0; i <= max_ABC; i++) { num_of_steps_to_reach[i] = -1; } cin >> a >> b >> c; num_of_steps_to_reach[a] = 0; num_of_steps_to_reach[b] = 0; num_of_steps_to_reach[c] = 0; n = a + b + c; queue<pair<pair<int, int>, int>> q; q.push(pair(pair(a, b), 0)); pair<pair<int, int>, int> pos_decants; pair<int, int> aux_pair; map<pair<int, int>, bool> odw; odw[pair(a, b)] = true; int free_space; while(!q.empty()) { pos_decants = q.front(); abc[0] = pos_decants.first.first; abc[1] = pos_decants.first.second; abc[2] = n - abc[0] - abc[1]; for (auto move: moves) { free_space = ABC[move.second] - abc[move.second]; for(auto i = 0; i < 3; i++) { new_abc[i] = abc[i]; } if (abc[move.first] > free_space) { new_abc[move.first] -= free_space; new_abc[move.second] += free_space; } else { new_abc[move.second] += new_abc[move.first]; new_abc[move.first] = 0; } aux_pair = pair(new_abc[0], new_abc[1]); if (odw.find(aux_pair) == odw.end()) { q.push(pair(aux_pair, pos_decants.second + 1)); odw[aux_pair] = true; for(auto i = 0; i < 3; i++) { if (num_of_steps_to_reach[new_abc[i]] == -1) { num_of_steps_to_reach[new_abc[i]] = pos_decants.second + 1; } } } } q.pop(); } for (auto i = 0; i <= ABC[2]; i++) { cout << num_of_steps_to_reach[i] << " "; } return 0; } |