#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]); } } } |