#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int G = 5;
int space[3];
int dis[N];
bitset<N> odw[3][2];
void make_move(vector<int> &state, int gleb, queue<pair<vector<int>, int> > &order) {
for (int v : state) {
if (dis[v] == 0 || dis[v] > gleb) {
dis[v] = gleb;
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) {
continue;
}
vector<int> new_state(state);
int ile = min(space[j] - state[j], state[i]);
new_state[j] += ile;
new_state[i] -= ile;
if (ile == state[i]) {
int nr = 2;
if (i == 2) {
nr--;
}
if (!odw[i][0][new_state[nr]]) {
order.push(make_pair(new_state, gleb + 1));
odw[i][0][new_state[nr]] = true;
}
}
else {
int nr = 2;
if (j == 2) {
nr--;
}
if (!odw[j][1][new_state[nr]]) {
order.push(make_pair(new_state, gleb + 1));
odw[j][1][new_state[nr]] = true;
}
}
}
}
}
int main() {
vector<int> tab(3);
for (int i = 0; i < 3; i++) {
scanf("%d", &space[i]);
}
for (int i = 0; i < 3; i++) {
scanf("%d", &tab[i]);
}
queue<pair<vector<int>, int> > order;
make_move(tab, 1, order);
while (!order.empty()) {
vector<int> state = order.front().first;
int gleb = order.front().second;
order.pop();
make_move(state, gleb, order);
}
for (int i = 0; i <= space[2]; i++) {
printf("%d ", dis[i] - 1);
}
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 61 62 63 64 65 66 67 68 69 70 | #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int G = 5; int space[3]; int dis[N]; bitset<N> odw[3][2]; void make_move(vector<int> &state, int gleb, queue<pair<vector<int>, int> > &order) { for (int v : state) { if (dis[v] == 0 || dis[v] > gleb) { dis[v] = gleb; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { continue; } vector<int> new_state(state); int ile = min(space[j] - state[j], state[i]); new_state[j] += ile; new_state[i] -= ile; if (ile == state[i]) { int nr = 2; if (i == 2) { nr--; } if (!odw[i][0][new_state[nr]]) { order.push(make_pair(new_state, gleb + 1)); odw[i][0][new_state[nr]] = true; } } else { int nr = 2; if (j == 2) { nr--; } if (!odw[j][1][new_state[nr]]) { order.push(make_pair(new_state, gleb + 1)); odw[j][1][new_state[nr]] = true; } } } } } int main() { vector<int> tab(3); for (int i = 0; i < 3; i++) { scanf("%d", &space[i]); } for (int i = 0; i < 3; i++) { scanf("%d", &tab[i]); } queue<pair<vector<int>, int> > order; make_move(tab, 1, order); while (!order.empty()) { vector<int> state = order.front().first; int gleb = order.front().second; order.pop(); make_move(state, gleb, order); } for (int i = 0; i <= space[2]; i++) { printf("%d ", dis[i] - 1); } printf("\n"); } |
English