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
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int A,B,C,a0,b0,c0;
    cin >> A >> B >> C >> a0 >> b0 >> c0;

    int unknown = C+1;
    vector<int> res(C+1, INT_MAX);
    res[a0] = res[b0] = res[c0] = 0;

    set<tuple<int,int,int>> visited;
    visited.insert(make_tuple(a0,b0,c0));

    queue<tuple<int,int,int,int>> frontier;
    frontier.push(make_tuple(a0,b0,c0,0));

    while(!frontier.empty())
    {
        //cout << "frontier_size = " << frontier.size() << endl;
        //cout << "visited_size = " << visited.size() << endl;
        auto x = frontier.front();
        // unpack x
        int a = get<0>(x);
        int b = get<1>(x);
        int c = get<2>(x);
        int d = get<3>(x);
        //cout << "front: (" << a << "," << b << "," << c << "," << d << ")" << endl;

        // wolne miejsce
        int wa = A-a;
        int wb = B-b;
        int wc = C-c;

        int ap[6], bp[6], cp[6], z;

        // a do b
        z = min(a,wb);
        ap[0] = a - z; bp[0] = b + z; cp[0] = c;

        // a do c
        z = min(a,wc);
        ap[1] = a - z; bp[1] = b; cp[1] = c + z;

        // b do a
        z = min(b,wa);
        ap[2] = a + z; bp[2] = b - z; cp[2] = c;

        // b do c
        z = min(b,wc);
        ap[3] = a; bp[3] = b - z; cp[3] = c + z;

        // c do a
        z = min(c,wa);
        ap[4] = a + z; bp[4] = b; cp[4] = c - z;

        // c do b
        z = min(c,wb);
        ap[5] = a; bp[5] = b + z; cp[5] = c - z;


        for(int i=0; i<6; ++i)
            if(visited.count(make_tuple(ap[i],bp[i],cp[i]))==0)
            {
                visited.insert(make_tuple(ap[i],bp[i],cp[i]));
                frontier.push(make_tuple(ap[i],bp[i],cp[i],d+1));
                if(res[ap[i]]==INT_MAX)
                {
                    res[ap[i]] = d+1;
                    --unknown;
                }
                if(res[bp[i]]==INT_MAX)
                {
                    res[bp[i]] = d+1;
                    --unknown;
                }
                if(res[cp[i]]==INT_MAX)
                {
                    res[cp[i]] = d+1;
                    --unknown;
                }
                //res[ap[i]] = min(res[ap[i]], d+1);
                //res[bp[i]] = min(res[bp[i]], d+1);
                //res[cp[i]] = min(res[cp[i]], d+1);
            }
        if(unknown==0) break;
        frontier.pop();
    }
    for(int i=0; i<=C; ++i)
        cout << (res[i]==INT_MAX?-1:res[i]) << " ";
    cout << endl;
}