#include <bits/stdc++.h>
#define REP(i,n) for (int _n=(n), i=0;i<_n;++i)
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;++i)
#define FORD(i,a,b) for (int i=(a),_b=(b);i>=_b;--i)
#define TRACE(x) std::cerr << "TRACE(" #x ")" << std::endl;
#define DEBUG(x) std::cerr << #x << " = " << (x) << std::endl;
void init_io() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
}
using State = std::array<int, 3>;
State size;
State initial;
int num_states;
std::vector<int> solution;
void read_input() {
REP(i, 3) std::cin >> size[i];
REP(i, 3) std::cin >> initial[i];
}
void prepare_encoding() {
num_states = 1;
REP(i, 3) num_states += 2 * (size[i] + 1);
}
int encode(const State &state) {
int special = 0;
int next = 1;
int encoded = 1;
while (special != 3 && state[special] != 0 && state[special] != size[special]) {
encoded += 2 * (size[next] + 1);
++special;
++next;
if (next==3) next = 0;
}
if (special == 3) return 0;
if (state[special] != 0) encoded += (size[next] + 1);
encoded += state[next];
return encoded;
}
State make_move(State s, int from, int to) {
const int amount = std::min(s[from], size[to] - s[to]);
s[from] -= amount;
s[to] += amount;
return s;
}
void bfs() {
solution.assign(size[2] + 1, -1);
std::vector<char> visited(num_states, 0);
std::vector<State> current;
std::vector<State> next;
current.reserve(num_states);
next.reserve(num_states);
current.push_back(initial);
visited[encode(initial)] = 1;
int dist = 0;
for (;;) {
if (current.empty()) {
current.swap(next);
++dist;
if (current.empty()) break;
}
const State state = current.back();
current.pop_back();
REP(i, 3) {
int &s = solution[state[i]];
if (s==-1) s=dist;
}
REP(from, 3) REP(to, 3) if (from != to) {
const State state2 = make_move(state, from, to);
auto &vis = visited[encode(state2)];
if (vis) continue;
vis = 1;
next.push_back(state2);
}
}
}
void print() {
for (int s : solution) std::cout << s << ' ';
std::cout << '\n';
}
int main() {
init_io();
read_input();
prepare_encoding();
bfs();
print();
}
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 | #include <bits/stdc++.h> #define REP(i,n) for (int _n=(n), i=0;i<_n;++i) #define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;++i) #define FORD(i,a,b) for (int i=(a),_b=(b);i>=_b;--i) #define TRACE(x) std::cerr << "TRACE(" #x ")" << std::endl; #define DEBUG(x) std::cerr << #x << " = " << (x) << std::endl; void init_io() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); } using State = std::array<int, 3>; State size; State initial; int num_states; std::vector<int> solution; void read_input() { REP(i, 3) std::cin >> size[i]; REP(i, 3) std::cin >> initial[i]; } void prepare_encoding() { num_states = 1; REP(i, 3) num_states += 2 * (size[i] + 1); } int encode(const State &state) { int special = 0; int next = 1; int encoded = 1; while (special != 3 && state[special] != 0 && state[special] != size[special]) { encoded += 2 * (size[next] + 1); ++special; ++next; if (next==3) next = 0; } if (special == 3) return 0; if (state[special] != 0) encoded += (size[next] + 1); encoded += state[next]; return encoded; } State make_move(State s, int from, int to) { const int amount = std::min(s[from], size[to] - s[to]); s[from] -= amount; s[to] += amount; return s; } void bfs() { solution.assign(size[2] + 1, -1); std::vector<char> visited(num_states, 0); std::vector<State> current; std::vector<State> next; current.reserve(num_states); next.reserve(num_states); current.push_back(initial); visited[encode(initial)] = 1; int dist = 0; for (;;) { if (current.empty()) { current.swap(next); ++dist; if (current.empty()) break; } const State state = current.back(); current.pop_back(); REP(i, 3) { int &s = solution[state[i]]; if (s==-1) s=dist; } REP(from, 3) REP(to, 3) if (from != to) { const State state2 = make_move(state, from, to); auto &vis = visited[encode(state2)]; if (vis) continue; vis = 1; next.push_back(state2); } } } void print() { for (int s : solution) std::cout << s << ' '; std::cout << '\n'; } int main() { init_io(); read_input(); prepare_encoding(); bfs(); print(); } |
English