#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#define S 100007
using namespace std;
typedef pair < int, pair < int , int > > pa;
int T[S];
queue < pair < pa, int > > q;
int A,B,C;
map < pa, bool > visited;
void f(int x, int y){
T[x] = min(T[x],y);
}
pa g(pa x, int i, int j){
pa tmp = x;
int ma = 1e9;
if(i == 1){
ma = tmp.first;
}else if (i == 2){
ma = tmp.second.first;
}else{
ma = tmp.second.second;
}
if(j == 1){
ma = min(ma, A - tmp.first);
}else if(j == 2){
ma = min(ma, B - tmp.second.first);
}else{
ma = min(ma, C - tmp.second.second);
}
if(i == 1){
tmp.first -= ma;
}else if (i == 2){
tmp.second.first -= ma;
}else{
tmp.second.second -= ma;
}
if(j == 1){
tmp.first += ma;
}else if(j == 2){
tmp.second.first += ma;
}else{
tmp.second.second += ma;
}
return tmp;
}
void BFS(){
while(!q.empty()){
pa x = q.front().first;
int d = q.front().second;
q.pop();
if(visited[x])
continue;
visited[x] = 1;
f(x.first,d);
f(x.second.first,d);
f(x.second.second,d);
for(int i = 1; i <= 3;i++){
for(int j = 1; j <= 3;j++){
if(i == j)
continue;
pa y = g(x,i,j);
q.push({y,d+1});
}
}
}
}
int main(void){
int a,b,c;
scanf("%d %d %d %d %d %d",&A,&B,&C,&a,&b,&c);
for(int i = 0; i <= C;i++){
T[i] = 1e9;
}
pa tmp = {a,{b,c}};
q.push({tmp,0});
BFS();
for(int i = 0; i <= C;i++){
if(T[i] > 1e8){
printf("-1 ");
}else{
printf("%d ",T[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 95 96 97 98 | #include<cstdio> #include<algorithm> #include<map> #include<queue> #define S 100007 using namespace std; typedef pair < int, pair < int , int > > pa; int T[S]; queue < pair < pa, int > > q; int A,B,C; map < pa, bool > visited; void f(int x, int y){ T[x] = min(T[x],y); } pa g(pa x, int i, int j){ pa tmp = x; int ma = 1e9; if(i == 1){ ma = tmp.first; }else if (i == 2){ ma = tmp.second.first; }else{ ma = tmp.second.second; } if(j == 1){ ma = min(ma, A - tmp.first); }else if(j == 2){ ma = min(ma, B - tmp.second.first); }else{ ma = min(ma, C - tmp.second.second); } if(i == 1){ tmp.first -= ma; }else if (i == 2){ tmp.second.first -= ma; }else{ tmp.second.second -= ma; } if(j == 1){ tmp.first += ma; }else if(j == 2){ tmp.second.first += ma; }else{ tmp.second.second += ma; } return tmp; } void BFS(){ while(!q.empty()){ pa x = q.front().first; int d = q.front().second; q.pop(); if(visited[x]) continue; visited[x] = 1; f(x.first,d); f(x.second.first,d); f(x.second.second,d); for(int i = 1; i <= 3;i++){ for(int j = 1; j <= 3;j++){ if(i == j) continue; pa y = g(x,i,j); q.push({y,d+1}); } } } } int main(void){ int a,b,c; scanf("%d %d %d %d %d %d",&A,&B,&C,&a,&b,&c); for(int i = 0; i <= C;i++){ T[i] = 1e9; } pa tmp = {a,{b,c}}; q.push({tmp,0}); BFS(); for(int i = 0; i <= C;i++){ if(T[i] > 1e8){ printf("-1 "); }else{ printf("%d ",T[i]); } } } |
English