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
#include <bits/stdc++.h>
#define FOR(i,n) for(int i = 0; i<n; ++i)
#define FOREACH(v, a) for(auto & v : (a))
#define X first
#define Y second
#define PR std::pair
#define MPR std::make_pair
typedef long long ll;
typedef std::vector<int> VI;

using namespace std;

#pragma region Ready functions

int fastPower(int a, int b){
    int res=1, pop_a = a;
    while(b){
        if(b&1) res *= pop_a;
        pop_a *= pop_a;
        b>>=1;
    }
    return res;
}

#pragma endregion

int A,B,C;
int a,b,c;
map<vector<int>, bool> combinations;
int LitMoves[100002];

queue<pair<vector<int>, int>> kol;

void GetCombos(vector<int> botSizes, int moves){

    kol.push({botSizes, moves});

    while(kol.size()){
        botSizes = kol.front().first;
        moves = kol.front().second;
        kol.pop();
        
        //if(moves>4) continue;

        if(combinations[botSizes]) continue;
        combinations[botSizes] = true;

        LitMoves[botSizes[0]] = min(LitMoves[botSizes[0]], moves);
        LitMoves[botSizes[1]] = min(LitMoves[botSizes[1]], moves);
        LitMoves[botSizes[2]] = min(LitMoves[botSizes[2]], moves);

        //cout<<botSizes[0]<<" "<<botSizes[1]<<" "<<botSizes[2]<<" moves: "<<moves<<endl;

        //przelej z 0 do 1
        int ileMoznaLac = B-botSizes[1];
        int ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[0]);
            kol.push({{botSizes[0]-ileLeje, botSizes[1]+ileLeje, botSizes[2]}, moves+1});
        }

        //przelej z 2 do 1
        ileMoznaLac = B-botSizes[1];
        ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[2]);
            kol.push({{botSizes[0], botSizes[1]+ileLeje, botSizes[2]-ileLeje}, moves+1});
        }

        //przelej z 1 do 0
        ileMoznaLac = A-botSizes[0];
        ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[1]);
            kol.push({{botSizes[0]+ileLeje, botSizes[1]-ileLeje, botSizes[2]}, moves+1});
        }

        //przelej z 2 do 0
        ileMoznaLac = A-botSizes[0];
        ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[2]);
            kol.push({{botSizes[0]+ileLeje, botSizes[1], botSizes[2]-ileLeje}, moves+1});
        }

        //przelej z 0 do 2
        ileMoznaLac = C-botSizes[2];
        ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[0]);
            kol.push({{botSizes[0]-ileLeje, botSizes[1], botSizes[2]+ileLeje}, moves+1});
        }

        //przelej z 1 do 2
        ileMoznaLac = C-botSizes[2];
        ileLeje = 0;
        if(ileMoznaLac != 0){
            ileLeje = min(ileMoznaLac, botSizes[1]);
            kol.push({{botSizes[0], botSizes[1]-ileLeje, botSizes[2]+ileLeje}, moves+1});
        }
    }

}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin>>A>>B>>C;
    cin>>a>>b>>c;

    FOR(i, C+1) LitMoves[i] = INT_MAX;

    GetCombos({a,b,c}, 0);

    for(int i = 0; i<=C; i++){
        cout<<(LitMoves[i] == INT_MAX ? -1 : LitMoves[i])<<" ";
    }
    

    
}