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
#include <iostream>
#include <unordered_set>
#include <vector>
#include <deque>
using namespace std;

void pour(int A, int B, int a, int b, int &ao, int &bo) {
	(void)A;
	int x = min(a, B-b);
	ao = a - x;
	bo = b + x;
}

void push(deque<pair<pair<int,int>,int>> &Q, int a, int b, int d) {
	Q.push_back({{a, b}, d});
}

int main() {
	int A, B, C;
	int a, b, c;
	cin >> A >> B >> C;
	cin >> a >> b >> c;
	int t = a+b+c;
	
	auto hasher = [](const pair<int,int> &p) {
		return p.first * 131072 + p.second;
	};
	unordered_set<pair<int,int>,decltype(hasher)> V(0, hasher);
	deque<pair<pair<int,int>,int>> Q;

	Q.push_back({{a,b}, 0});
	vector<int> S(C+1, -1);
	while (!Q.empty()) {
		auto s = Q.front();
		Q.pop_front();

		auto i = V.find(s.first);
		if (i != V.end()) continue;
		V.insert(s.first);

		a = s.first.first;
		b = s.first.second;
		c = t - a - b;
		
		if (S[a] == -1 || S[a] > s.second) S[a] = s.second;
		if (S[b] == -1 || S[b] > s.second) S[b] = s.second;
		if (S[c] == -1 || S[c] > s.second) S[c] = s.second;
		int na, nb, nc;
		pour(A, B, a, b, na, nb); push(Q, na, nb, s.second+1);
		pour(B, A, b, a, nb, na); push(Q, na, nb, s.second+1);
		pour(A, C, a, c, na, nc); push(Q, na,  b, s.second+1);
		pour(C, A, c, a, nc, na); push(Q, na,  b, s.second+1);
		pour(B, C, b, c, nb, nc); push(Q,  a, nb, s.second+1);
		pour(C, B, c, b, nc, nb); push(Q,  a, nb, s.second+1);
	}
	for (int i=0; i<C; i++) cout << S[i] << " ";
	cout << S[C] << "\n";
	return 0;
}