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
#include <iostream>
#include <fstream>
#include <map>
#include <stack>

using namespace std;
int A, B, C, a, b, c;

void wczytaj(){
    scanf("%d %d %d", &A, &B, &C);
    scanf("%d %d %d", &a, &b, &c);
}

struct stan{
    int x, y, z;
    bool operator<(const stan& Prawy) const{
        if(x<Prawy.x) return 1;
        if(x>Prawy.x) return 0;
        if(y<Prawy.y) return 1;
        if(y>Prawy.y) return 0;
        return z<Prawy.z;
    }
    stan opBA(){
        stan zwrot;
        zwrot.x=min(A, x+y);
        zwrot.y=x+y-zwrot.x;
        zwrot.z=z;
        return zwrot;
    }
    stan opAB(){
        stan zwrot;
        zwrot.y=min(B, x+y);
        zwrot.x=x+y-zwrot.y;
        zwrot.z=z;
        return zwrot;
    }
    stan opCA(){
        stan zwrot;
        zwrot.x=min(A, x+z);
        zwrot.y=y;
        zwrot.z=x+z-zwrot.x;
        return zwrot;
    }
    stan opAC(){
        stan zwrot;
        zwrot.z = min(C, x+z);
        zwrot.y=y;
        zwrot.x=x+z-zwrot.z;
        return zwrot;
    }
    stan opCB(){
        stan zwrot;
        zwrot.y=min(B, y+z);
        zwrot.x=x;
        zwrot.z = y+z-zwrot.y;
        return zwrot;
    }
    stan opBC(){
        stan zwrot;
        zwrot.z=min(C, y+z);
        zwrot.x=x;
        zwrot.y=y+z-zwrot.z;
        return zwrot;
    }
};

map<stan, int> odleglosci;
int * najkrocej;
void rozw(){
    najkrocej = new int[C+1];
    int odl=0;
    stan stpom;
    stpom.x=a;
    stpom.y=b;
    stpom.z=c;
    stack<stan> * wej = new stack<stan>;
    stack<stan> * wyj = new stack<stan>;
    wej->push(stpom);
    while(!wej->empty()){
        while(!wej->empty()){
            if(odleglosci.count(wej->top())==0){
                odleglosci[wej->top()] = odl;
                wyj->push((wej->top()).opAB());
                wyj->push((wej->top()).opBA());
                wyj->push((wej->top()).opAC());
                wyj->push((wej->top()).opCA());
                wyj->push((wej->top()).opBC());
                wyj->push((wej->top()).opCB());
            }
            wej->pop();
        }
        odl++;
        stack<stan> * wskpom = wej;
        wej=wyj;
        wyj=wskpom;
    }
    for(int i=0; i<=C; i++) najkrocej[i]=1000000000;
    for(auto it=odleglosci.begin(); it!=odleglosci.end(); it++){
        stpom = it->first;
        odl = it->second;
        najkrocej[stpom.x] = min(najkrocej[stpom.x], odl);
        najkrocej[stpom.y] = min(najkrocej[stpom.y], odl);
        najkrocej[stpom.z] = min(najkrocej[stpom.z], odl);
    }
    for(int i=0; i<=C; i++)
        if(najkrocej[i]==1000000000) printf("-1 "); else
        printf("%d ", najkrocej[i]);
}

int main()
{
    wczytaj();
    rozw();
    return 0;
}