#include <iostream>
#include <bitset>
#include <map>
#include <algorithm>
#include <utility>
#include <queue>
using namespace std;
struct st{
int a, b, c, time;
};
int A, B, C, x, y, z, tabwyn[100001];
bitset<100001> bs;
map<unsigned long long, bool> mp;
queue<st> q;
void recc(int a, int b, int c, int time){
q.push({a, b, c, 0});
while(!q.empty()){
a = q.front().a;
b = q.front().b;
c = q.front().c;
time = q.front().time;
q.pop();
//printf("\n%d %d %d", a, b, c);
if(!bs[a]) tabwyn[a] = time;
else tabwyn[a] = min(tabwyn[a], time);
if(!bs[b]) tabwyn[b] = time;
else tabwyn[b] = min(tabwyn[b], time);
if(!bs[c]) tabwyn[c] = time;
else tabwyn[c] = min(tabwyn[c], time);
bs[a] = 1;
bs[b] = 1;
bs[c] = 1;
//add2a
if(b){
if(a + b > A){
if(!mp[A*1e13+(b - (A-a))*1e07+c]){
mp[A*1e13+(b - (A-a))*1e07+c] = 1;
//recc(A, b - (A-a), c, time+1);
q.push({A, b - (A-a), c, time+1});
}
}
else if(!mp[(a+b)*1e13+0*1e07+c]){
mp[(a+b)*1e13+0*1e07+c] = 1;
//recc(a + b, 0, c, time+1);
q.push({a + b, 0, c, time+1});
}
}
if(c){
if(a + c > A){
if(!mp[A*1e13+b*1e07+(c - (A-a))]){
mp[A*1e13+b*1e07+(c - (A-a))] = 1;
//recc(A, b, c - (A-a), time+1);
q.push({A, b, c - (A-a), time+1});
}
}
else if(!mp[(a+c)*1e13+b*1e07+0]){
mp[(a+c)*1e13+b*1e07+0] = 1;
//recc(a + c, b, 0, time+1);
q.push({a + c, b, 0, time+1});
}
}
//add2b
if(a){
if(b + a > B){
if(!mp[(a - (B-b))*1e13+B*1e07+c]){
mp[(a - (B-b))*1e13+B*1e07+c] = 1;
//recc(a - (B-b), B, c, time+1);
q.push({a - (B-b), B, c, time+1});
}
}
else if(!mp[0*1e13+(b + a)*1e07+c]){
mp[0*1e13+(b + a)*1e07+c] = 1;
//recc(0, b + a, c, time+1);
q.push({0, b + a, c, time+1});
}
}
if(c){
if(b + c > B){
if(!mp[a*1e13+B*1e07+c-(B-b)]){
mp[a*1e13+B*1e07+c-(B-b)] = 1;
//recc(a, B, c - (B-b), time+1);
q.push({a, B, c - (B-b), time+1});
}
}
else if(!mp[a*1e13+(b + c)*1e07+0]){
mp[a*1e13+(b + c)*1e07+0] = 1;
//recc(a, b + c, 0, time+1);
q.push({a, b + c, 0, time+1});
}
}
//add2c
if(a){
if(c + a > C){
if(!mp[(a - (C-c))*1e13+b*1e07+C]){
mp[(a - (C-c))*1e13+b*1e07+C] = 1;
//recc(a - (C-c), b, C, time+1);
q.push({a - (C-c), b, C, time+1});
}
}
else if(!mp[0*1e13+b*1e07+(c+a)]){
mp[0*1e13+b*1e07+(c+a)] = 1;
//recc(0, b, c + a, time+1);
q.push({0, b, c + a, time+1});
}
}
if(b){
if(c + b > C){
if(!mp[a*1e13+(b - (C-c))*1e07+C]){
mp[a*1e13+(b - (C-c))*1e07+C] = 1;
//recc(a, b - (C-c), C, time+1);
q.push({a, b - (C-c), C, time+1});
}
}
else if(!mp[a*1e13+0*1e07+(c+b)]){
mp[a*1e13+0*1e07+(c+b)] = 1;
//recc(a, 0, c + b, time+1);
q.push({a, 0, c + b, time+1});
}
}
}
}
int main()
{
scanf("%d%d%d%d%d%d", &A, &B, &C, &x, &y, &z);
recc(x, y, z, 0);
for(int i = 0; i <= C; i++){
if(bs[i]) printf("%d ", tabwyn[i]);
else printf("-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 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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #include <iostream> #include <bitset> #include <map> #include <algorithm> #include <utility> #include <queue> using namespace std; struct st{ int a, b, c, time; }; int A, B, C, x, y, z, tabwyn[100001]; bitset<100001> bs; map<unsigned long long, bool> mp; queue<st> q; void recc(int a, int b, int c, int time){ q.push({a, b, c, 0}); while(!q.empty()){ a = q.front().a; b = q.front().b; c = q.front().c; time = q.front().time; q.pop(); //printf("\n%d %d %d", a, b, c); if(!bs[a]) tabwyn[a] = time; else tabwyn[a] = min(tabwyn[a], time); if(!bs[b]) tabwyn[b] = time; else tabwyn[b] = min(tabwyn[b], time); if(!bs[c]) tabwyn[c] = time; else tabwyn[c] = min(tabwyn[c], time); bs[a] = 1; bs[b] = 1; bs[c] = 1; //add2a if(b){ if(a + b > A){ if(!mp[A*1e13+(b - (A-a))*1e07+c]){ mp[A*1e13+(b - (A-a))*1e07+c] = 1; //recc(A, b - (A-a), c, time+1); q.push({A, b - (A-a), c, time+1}); } } else if(!mp[(a+b)*1e13+0*1e07+c]){ mp[(a+b)*1e13+0*1e07+c] = 1; //recc(a + b, 0, c, time+1); q.push({a + b, 0, c, time+1}); } } if(c){ if(a + c > A){ if(!mp[A*1e13+b*1e07+(c - (A-a))]){ mp[A*1e13+b*1e07+(c - (A-a))] = 1; //recc(A, b, c - (A-a), time+1); q.push({A, b, c - (A-a), time+1}); } } else if(!mp[(a+c)*1e13+b*1e07+0]){ mp[(a+c)*1e13+b*1e07+0] = 1; //recc(a + c, b, 0, time+1); q.push({a + c, b, 0, time+1}); } } //add2b if(a){ if(b + a > B){ if(!mp[(a - (B-b))*1e13+B*1e07+c]){ mp[(a - (B-b))*1e13+B*1e07+c] = 1; //recc(a - (B-b), B, c, time+1); q.push({a - (B-b), B, c, time+1}); } } else if(!mp[0*1e13+(b + a)*1e07+c]){ mp[0*1e13+(b + a)*1e07+c] = 1; //recc(0, b + a, c, time+1); q.push({0, b + a, c, time+1}); } } if(c){ if(b + c > B){ if(!mp[a*1e13+B*1e07+c-(B-b)]){ mp[a*1e13+B*1e07+c-(B-b)] = 1; //recc(a, B, c - (B-b), time+1); q.push({a, B, c - (B-b), time+1}); } } else if(!mp[a*1e13+(b + c)*1e07+0]){ mp[a*1e13+(b + c)*1e07+0] = 1; //recc(a, b + c, 0, time+1); q.push({a, b + c, 0, time+1}); } } //add2c if(a){ if(c + a > C){ if(!mp[(a - (C-c))*1e13+b*1e07+C]){ mp[(a - (C-c))*1e13+b*1e07+C] = 1; //recc(a - (C-c), b, C, time+1); q.push({a - (C-c), b, C, time+1}); } } else if(!mp[0*1e13+b*1e07+(c+a)]){ mp[0*1e13+b*1e07+(c+a)] = 1; //recc(0, b, c + a, time+1); q.push({0, b, c + a, time+1}); } } if(b){ if(c + b > C){ if(!mp[a*1e13+(b - (C-c))*1e07+C]){ mp[a*1e13+(b - (C-c))*1e07+C] = 1; //recc(a, b - (C-c), C, time+1); q.push({a, b - (C-c), C, time+1}); } } else if(!mp[a*1e13+0*1e07+(c+b)]){ mp[a*1e13+0*1e07+(c+b)] = 1; //recc(a, 0, c + b, time+1); q.push({a, 0, c + b, time+1}); } } } } int main() { scanf("%d%d%d%d%d%d", &A, &B, &C, &x, &y, &z); recc(x, y, z, 0); for(int i = 0; i <= C; i++){ if(bs[i]) printf("%d ", tabwyn[i]); else printf("-1 "); } return 0; } |
English