#include <queue>
#include <stdio.h>
#include <unordered_map>
struct Solution
{
int a;
int b;
int c;
bool operator==(const Solution &s) const
{
return a == s.a && b == s.b && c == s.c;
}
struct HashFunction
{
size_t operator()(const Solution &s) const
{
constexpr auto MAX_N = 10000000;
size_t a = std::hash<int>()(s.a);
size_t b = std::hash<int>()(s.b);
size_t c = std::hash<int>()(s.c);
return a * MAX_N * MAX_N + b * MAX_N + c;
}
};
std::vector<Solution> generate(const int &A, const int &B, const int &C) const
{
std::vector<Solution> solutions;
solutions.push_back({a - std::min(a, B - b), b + std::min(a, B - b), c}); //a->b
solutions.push_back({a - std::min(a, C - c), b, c + std::min(a, C - c)}); //a->c
solutions.push_back({a + std::min(b, A - a), b - std::min(b, A - a), c}); //b->a
solutions.push_back({a, b - std::min(b, C - c), c + std::min(b, C - c)}); //b->c
solutions.push_back({a + std::min(c, A - a), b, c - std::min(c, A - a)}); //c->a
solutions.push_back({a, b + std::min(c, B - b), c - std::min(c, B - b)}); //c->b
return solutions;
}
};
void solve(const int &A, const int &B, const int &C, const Solution initSolution)
{
std::queue<Solution> solutions;
std::unordered_map<Solution, int, Solution::HashFunction> moves;
std::unordered_map<int, int> minimalMoves;
solutions.push(initSolution);
moves[initSolution] = 0;
while (!solutions.empty())
{
const auto &s = solutions.front();
const auto m = moves[s];
if (minimalMoves.count(s.a) == 0)
minimalMoves[s.a] = m;
if (minimalMoves.count(s.b) == 0)
minimalMoves[s.b] = m;
if (minimalMoves.count(s.c) == 0)
minimalMoves[s.c] = m;
for (const auto &g : s.generate(A, B, C))
{
if (moves.count(g) == 0)
{
moves[g] = m + 1;
solutions.push(g);
}
}
solutions.pop();
}
for (int i = 0; i <= C; ++i)
{
if (minimalMoves.count(i))
printf("%d ", minimalMoves[i]);
else
printf("-1 ");
}
printf("\n");
}
int main()
{
int A, B, C, a, b, c;
scanf("%d %d %d\n", &A, &B, &C);
scanf("%d %d %d\n", &a, &b, &c);
solve(A, B, C, {a, b, c});
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 86 87 88 89 | #include <queue> #include <stdio.h> #include <unordered_map> struct Solution { int a; int b; int c; bool operator==(const Solution &s) const { return a == s.a && b == s.b && c == s.c; } struct HashFunction { size_t operator()(const Solution &s) const { constexpr auto MAX_N = 10000000; size_t a = std::hash<int>()(s.a); size_t b = std::hash<int>()(s.b); size_t c = std::hash<int>()(s.c); return a * MAX_N * MAX_N + b * MAX_N + c; } }; std::vector<Solution> generate(const int &A, const int &B, const int &C) const { std::vector<Solution> solutions; solutions.push_back({a - std::min(a, B - b), b + std::min(a, B - b), c}); //a->b solutions.push_back({a - std::min(a, C - c), b, c + std::min(a, C - c)}); //a->c solutions.push_back({a + std::min(b, A - a), b - std::min(b, A - a), c}); //b->a solutions.push_back({a, b - std::min(b, C - c), c + std::min(b, C - c)}); //b->c solutions.push_back({a + std::min(c, A - a), b, c - std::min(c, A - a)}); //c->a solutions.push_back({a, b + std::min(c, B - b), c - std::min(c, B - b)}); //c->b return solutions; } }; void solve(const int &A, const int &B, const int &C, const Solution initSolution) { std::queue<Solution> solutions; std::unordered_map<Solution, int, Solution::HashFunction> moves; std::unordered_map<int, int> minimalMoves; solutions.push(initSolution); moves[initSolution] = 0; while (!solutions.empty()) { const auto &s = solutions.front(); const auto m = moves[s]; if (minimalMoves.count(s.a) == 0) minimalMoves[s.a] = m; if (minimalMoves.count(s.b) == 0) minimalMoves[s.b] = m; if (minimalMoves.count(s.c) == 0) minimalMoves[s.c] = m; for (const auto &g : s.generate(A, B, C)) { if (moves.count(g) == 0) { moves[g] = m + 1; solutions.push(g); } } solutions.pop(); } for (int i = 0; i <= C; ++i) { if (minimalMoves.count(i)) printf("%d ", minimalMoves[i]); else printf("-1 "); } printf("\n"); } int main() { int A, B, C, a, b, c; scanf("%d %d %d\n", &A, &B, &C); scanf("%d %d %d\n", &a, &b, &c); solve(A, B, C, {a, b, c}); return 0; } |
English