#include <iostream>
#include <queue>
#include <set>
using namespace std;
struct Pos {
int t[3], r;
};
struct comperator {
inline bool operator () (const Pos &a, const Pos &b) const {
if(a.t[0] != b.t[0])
return a.t[0] < b.t[0];
if(a.t[1] != b.t[1])
return a.t[1] < b.t[1];
return a.t[2] < b.t[2];
}
};
constexpr int N = 1e5+7;
set <Pos,comperator> odw;
queue <Pos> kol;
int odp[N], licz;
Pos mk;
inline void bfs(Pos v) {
kol.push(v);
while(!kol.empty() && licz) {
v = kol.front();
kol.pop();
if(odw.find(v) != odw.end())
continue;
odw.insert(v);
for(int i=0;i!=3;i++)
for(int j=0;j!=3;j++)
if(i != j) { // z i do j
Pos u = v; u.r++;
int z = min(u.t[i],mk.t[j] - u.t[j]);
u.t[i] -= z; u.t[j] += z;
if(odw.find(u) == odw.end()) {
kol.push(u);
for(int k=0;k!=3;k++)
if(!odp[u.t[k]]) {
odp[u.t[k]] = u.r;
licz--;
}
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie();
Pos s; s.r=1;
cin>>mk.t[0]>>mk.t[1]>>mk.t[2]>>s.t[0]>>s.t[1]>>s.t[2];
licz = mk.t[2]+1;
for(int i=0;i!=3;i++)
if(!odp[s.t[i]]) {
odp[s.t[i]] = 1;
licz--;
}
bfs(s);
for(int i=0;i<=mk.t[2];i++)
cout<<odp[i]-1<<" ";
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 | #include <iostream> #include <queue> #include <set> using namespace std; struct Pos { int t[3], r; }; struct comperator { inline bool operator () (const Pos &a, const Pos &b) const { if(a.t[0] != b.t[0]) return a.t[0] < b.t[0]; if(a.t[1] != b.t[1]) return a.t[1] < b.t[1]; return a.t[2] < b.t[2]; } }; constexpr int N = 1e5+7; set <Pos,comperator> odw; queue <Pos> kol; int odp[N], licz; Pos mk; inline void bfs(Pos v) { kol.push(v); while(!kol.empty() && licz) { v = kol.front(); kol.pop(); if(odw.find(v) != odw.end()) continue; odw.insert(v); for(int i=0;i!=3;i++) for(int j=0;j!=3;j++) if(i != j) { // z i do j Pos u = v; u.r++; int z = min(u.t[i],mk.t[j] - u.t[j]); u.t[i] -= z; u.t[j] += z; if(odw.find(u) == odw.end()) { kol.push(u); for(int k=0;k!=3;k++) if(!odp[u.t[k]]) { odp[u.t[k]] = u.r; licz--; } } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(); Pos s; s.r=1; cin>>mk.t[0]>>mk.t[1]>>mk.t[2]>>s.t[0]>>s.t[1]>>s.t[2]; licz = mk.t[2]+1; for(int i=0;i!=3;i++) if(!odp[s.t[i]]) { odp[s.t[i]] = 1; licz--; } bfs(s); for(int i=0;i<=mk.t[2];i++) cout<<odp[i]-1<<" "; return 0; } |
English