#include <iostream>
#include <vector>
#include <set>
#include <queue>
using namespace std;
struct State {
int a, b, c;
bool operator<(const State& other) const {
if(a == other.a && b == other.b) return c < other.c;
if(a == other.a) return b < other.b;
return a < other.a;
}
State(int a, int b, int c) : a(a), b(b), c(c) {}
State() {}
};
struct Queue_state {
State s;
int d;
Queue_state() {}
Queue_state(State s, int d) : s(s), d(d) {}
};
int A, B, C;
vector<int> res;
set<State> states;
const int INF = 1e9;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int a, b, c;
cin>>A>>B>>C>>a>>b>>c;
res.assign(C + 1, INF);
State s(a, b, c);
queue<Queue_state> q;
q.push(Queue_state(s, 0));
states.insert(s);
while(!q.empty()) {
s = q.front().s;
int depth = q.front().d;
q.pop();
res[s.a] = min(res[s.a], depth);
res[s.b] = min(res[s.b], depth);
res[s.c] = min(res[s.c], depth);
State s1(max(0, s.a - (B - s.b)), min(s.b + s.a, B), s.c);
State s2(max(0, s.a - (C - s.c)), s.b, min(s.c + s.a, C));
State s3(s.a, max(0, s.b - (C - s.c)), min(s.c + s.b, C));
State s4(s.a, min(s.b + s.c, B), max(0, s.c - (B - s.b)));
State s5(min(s.a + s.c, A), s.b, max(0, s.c - (A - s.a)));
State s6(min(s.a + s.b, A), max(0, s.b - (A - s.a)), s.c);
if(states.find(s1) == states.end()) {
states.insert(s1);
q.push(Queue_state(s1, depth + 1));
}
if(states.find(s2) == states.end()) {
states.insert(s2);
q.push(Queue_state(s2, depth + 1));
}
if(states.find(s3) == states.end()) {
states.insert(s3);
q.push(Queue_state(s3, depth + 1));
}
if(states.find(s4) == states.end()) {
states.insert(s4);
q.push(Queue_state(s4, depth + 1));
}
if(states.find(s5) == states.end()) {
states.insert(s5);
q.push(Queue_state(s5, depth + 1));
}
if(states.find(s6) == states.end()) {
states.insert(s6);
q.push(Queue_state(s6, depth + 1));
}
}
for(int i = 0; i <= C; ++i) {
if(res[i] == INF) {
cout<<-1<<' ';
}else {
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 | #include <iostream> #include <vector> #include <set> #include <queue> using namespace std; struct State { int a, b, c; bool operator<(const State& other) const { if(a == other.a && b == other.b) return c < other.c; if(a == other.a) return b < other.b; return a < other.a; } State(int a, int b, int c) : a(a), b(b), c(c) {} State() {} }; struct Queue_state { State s; int d; Queue_state() {} Queue_state(State s, int d) : s(s), d(d) {} }; int A, B, C; vector<int> res; set<State> states; const int INF = 1e9; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int a, b, c; cin>>A>>B>>C>>a>>b>>c; res.assign(C + 1, INF); State s(a, b, c); queue<Queue_state> q; q.push(Queue_state(s, 0)); states.insert(s); while(!q.empty()) { s = q.front().s; int depth = q.front().d; q.pop(); res[s.a] = min(res[s.a], depth); res[s.b] = min(res[s.b], depth); res[s.c] = min(res[s.c], depth); State s1(max(0, s.a - (B - s.b)), min(s.b + s.a, B), s.c); State s2(max(0, s.a - (C - s.c)), s.b, min(s.c + s.a, C)); State s3(s.a, max(0, s.b - (C - s.c)), min(s.c + s.b, C)); State s4(s.a, min(s.b + s.c, B), max(0, s.c - (B - s.b))); State s5(min(s.a + s.c, A), s.b, max(0, s.c - (A - s.a))); State s6(min(s.a + s.b, A), max(0, s.b - (A - s.a)), s.c); if(states.find(s1) == states.end()) { states.insert(s1); q.push(Queue_state(s1, depth + 1)); } if(states.find(s2) == states.end()) { states.insert(s2); q.push(Queue_state(s2, depth + 1)); } if(states.find(s3) == states.end()) { states.insert(s3); q.push(Queue_state(s3, depth + 1)); } if(states.find(s4) == states.end()) { states.insert(s4); q.push(Queue_state(s4, depth + 1)); } if(states.find(s5) == states.end()) { states.insert(s5); q.push(Queue_state(s5, depth + 1)); } if(states.find(s6) == states.end()) { states.insert(s6); q.push(Queue_state(s6, depth + 1)); } } for(int i = 0; i <= C; ++i) { if(res[i] == INF) { cout<<-1<<' '; }else { cout<<res[i]<<' '; } } } |
English