-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmilk3.cpp
103 lines (83 loc) · 1.7 KB
/
milk3.cpp
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
/*
ID: th3c0r11
LANG: C++14
TASK: milk3
*/
#include <queue>
#include <algorithm>
#include <iostream>
#include <vector>
#include <fstream>
std::vector<int> possible;
struct Triple {
int a, b, c;
bool operator==(const Triple &t) const
{
return a == t.a && b == t.b && c == t.c;
}
};
std::vector<Triple> already;
std::queue<Triple> q;
int A, B, C;
void addPossible(int c)
{
bool unique = true;
for (auto i : possible) {
if (c == i) {
unique = false;
break;
}
}
if (unique)
possible.push_back(c);
}
void addTriple(Triple t)
{
bool unique = true;
for (const auto i : already)
if (i == t) {
unique = false;
break;
}
if (unique) {
already.push_back(t);
q.push(t);
}
}
void search(int a, int b, int c)
{
// try every pouring combination, if a is empty, return
// (to + from)
do {
if (a + b > A) addTriple({A, a + b - A, c});
else addTriple({a + b, 0, c});
if (c + b > C) addTriple({a, c + b - C, C});
else addTriple({a, 0, c + b});
if (b + a > B) addTriple({b + a - B, B, c});
else addTriple({0, b + a, c});
if (c + a > C) addTriple({c + a - C, b, C});
else addTriple({0, b, c + a});
if (a + c > A) addTriple({A, b, a + c - A});
else addTriple({a + c, b, 0});
if (b + c > B) addTriple({a, B, b + c - B});
else addTriple({a, b + c, 0});
auto triple = q.front();
a = triple.a;
b = triple.b;
c = triple.c;
q.pop();
if (a == 0)
addPossible(c);
} while (!q.empty());
}
int main()
{
std::ifstream in{"milk3.in"};
std::ofstream out{"milk3.out"};
in >> A >> B >> C;
search(0, 0, C);
std::sort(possible.begin(), possible.end());
for (std::size_t i = 0; i < possible.size() - 1; ++i)
out << possible[i] << ' ';
out << possible.back() << '\n';
}