#include <bits/stdc++.h> using namespace std; typedef vector<int> VI; typedef pair <int,int> ii; typedef pair <ii,int> iii; typedef long long LL; #define pb push_back const int INF = 2147483647; const int N = 100005; int tab[3], maxx[3], i, j, k, bat[3], mat[3], newV, res[N]; map<iii, int> mapa; iii v, v2; queue<iii> q; int main() { /*int ma = 0; int LIM = 10; for (int A=0;A<=LIM;A++) for (int B=A;B<=LIM;B++) for (int C=B;C<=LIM;C++) for (int a=0;a<=A;a++) for (int b=0;b<=B;b++) for (int c=0;c<=C;c++) { maxx[0] = A; maxx[1] = B; maxx[2] = C; tab[0] = a; tab[1] = b; tab[2] = c; s.clear(); for (i=0;i<=maxx[2];i++) res[i] = INF; go(0); if (s.size() > ma) { ma = s.size(); printf("%d : %d %d %d %d %d %d\n", ma, A, B, C, a, b, c); } }*/ for (i=0;i<3;i++) scanf("%d", &maxx[i]); for (i=0;i<3;i++) scanf("%d", &tab[i]); for (i=0;i<=maxx[2];i++) res[i] = INF; for (i=0;i<3;i++) res[tab[i]] = 0; mapa.clear(); mapa[iii(ii(tab[0], tab[1]), tab[2])] = 0; while(!q.empty()) q.pop(); q.push(iii(ii(tab[0], tab[1]), tab[2])); while (!q.empty()) { v = q.front(); q.pop(); bat[0] = v.first.first; bat[1] = v.first.second; bat[2] = v.second; for (i=0;i<3;i++) if (bat[i] < maxx[i]) { for (j=0;j<3;j++) if (i != j && bat[j] > 0) { int mov = min(maxx[i] - bat[i], bat[j]); for (k=0;k<3;k++) mat[k] = bat[k]; mat[i] += mov; mat[j] -= mov; v2 = iii(ii(mat[0], mat[1]), mat[2]); if (mapa.find(v2) != mapa.end()) continue; newV = mapa[v] + 1; mapa[v2] = newV; q.push(v2); for (k=0;k<3;k++) res[mat[k]] = min(res[mat[k]], newV); } } } for (i=0;i<=maxx[2];i++) if (res[i] == INF) printf("-1 "); else printf("%d ", res[i]); printf("\n"); //printf("%d\n", s.size()); 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 <bits/stdc++.h> using namespace std; typedef vector<int> VI; typedef pair <int,int> ii; typedef pair <ii,int> iii; typedef long long LL; #define pb push_back const int INF = 2147483647; const int N = 100005; int tab[3], maxx[3], i, j, k, bat[3], mat[3], newV, res[N]; map<iii, int> mapa; iii v, v2; queue<iii> q; int main() { /*int ma = 0; int LIM = 10; for (int A=0;A<=LIM;A++) for (int B=A;B<=LIM;B++) for (int C=B;C<=LIM;C++) for (int a=0;a<=A;a++) for (int b=0;b<=B;b++) for (int c=0;c<=C;c++) { maxx[0] = A; maxx[1] = B; maxx[2] = C; tab[0] = a; tab[1] = b; tab[2] = c; s.clear(); for (i=0;i<=maxx[2];i++) res[i] = INF; go(0); if (s.size() > ma) { ma = s.size(); printf("%d : %d %d %d %d %d %d\n", ma, A, B, C, a, b, c); } }*/ for (i=0;i<3;i++) scanf("%d", &maxx[i]); for (i=0;i<3;i++) scanf("%d", &tab[i]); for (i=0;i<=maxx[2];i++) res[i] = INF; for (i=0;i<3;i++) res[tab[i]] = 0; mapa.clear(); mapa[iii(ii(tab[0], tab[1]), tab[2])] = 0; while(!q.empty()) q.pop(); q.push(iii(ii(tab[0], tab[1]), tab[2])); while (!q.empty()) { v = q.front(); q.pop(); bat[0] = v.first.first; bat[1] = v.first.second; bat[2] = v.second; for (i=0;i<3;i++) if (bat[i] < maxx[i]) { for (j=0;j<3;j++) if (i != j && bat[j] > 0) { int mov = min(maxx[i] - bat[i], bat[j]); for (k=0;k<3;k++) mat[k] = bat[k]; mat[i] += mov; mat[j] -= mov; v2 = iii(ii(mat[0], mat[1]), mat[2]); if (mapa.find(v2) != mapa.end()) continue; newV = mapa[v] + 1; mapa[v2] = newV; q.push(v2); for (k=0;k<3;k++) res[mat[k]] = min(res[mat[k]], newV); } } } for (i=0;i<=maxx[2];i++) if (res[i] == INF) printf("-1 "); else printf("%d ", res[i]); printf("\n"); //printf("%d\n", s.size()); return 0; } |