aboutsummaryrefslogtreecommitdiff
path: root/2017/src/day24.cpp
diff options
context:
space:
mode:
Diffstat (limited to '2017/src/day24.cpp')
-rw-r--r--2017/src/day24.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/2017/src/day24.cpp b/2017/src/day24.cpp
new file mode 100644
index 0000000..fa4148c
--- /dev/null
+++ b/2017/src/day24.cpp
@@ -0,0 +1,102 @@
1#include <filesystem>
2#include <fstream>
3#include <iostream>
4#include <set>
5#include <vector>
6
7using namespace std;
8
9namespace {
10
11vector<tuple<long, long>>
12read_file(const filesystem::path& filename)
13{
14 ifstream file{ filename };
15 vector<tuple<long, long>> data;
16
17 long lhs = 0;
18 long rhs = 0;
19 char sep = 0;
20
21 while ( file >> lhs >> sep >> rhs ) {
22 data.emplace_back(lhs, rhs);
23 }
24 return data;
25}
26
27long
28strongest(const vector<tuple<long, long>>& data, long current = 0, const set<size_t>& used = {})
29{
30 long best_strength = 0;
31
32 for ( size_t i = 0; i != data.size(); ++i ) {
33 if ( used.contains(i) ) {
34 continue;
35 }
36
37 auto [lhs, rhs] = data.at(i);
38 if ( lhs == current || rhs == current ) {
39 auto next_port = (lhs == current) ? rhs : lhs;
40 auto new_used{ used };
41 new_used.emplace(i);
42 auto strength = lhs + rhs + strongest(data, next_port, new_used);
43 best_strength = max(best_strength, strength);
44 }
45 }
46
47 return best_strength;
48}
49
50tuple<long, size_t>
51strongest_and_longest(const vector<tuple<long, long>>& data, long current = 0, const set<size_t>& used = {})
52{
53 long best_strength = 0;
54 size_t best_length = 0;
55
56 for ( size_t i = 0; i != data.size(); ++i ) {
57 if ( used.contains(i) ) {
58 continue;
59 }
60
61 auto [lhs, rhs] = data.at(i);
62 if ( lhs == current || rhs == current ) {
63 auto next_port = (lhs == current) ? rhs : lhs;
64 auto new_used{ used };
65 new_used.emplace(i);
66 auto [sub_strength, sub_length] = strongest_and_longest(data, next_port, new_used);
67
68 auto total_strength = sub_strength + lhs + rhs;
69 auto total_length = sub_length + 1;
70
71 if ( total_length > best_length || (total_length == best_length && total_strength > best_strength) ) {
72 best_strength = total_strength;
73 best_length = total_length;
74 }
75 }
76 }
77
78 return make_tuple(best_strength, best_length);
79}
80
81void
82part1(const vector<tuple<long, long>>& data)
83{
84 cout << "Part1: " << strongest(data) << '\n';
85}
86
87void
88part2(const vector<tuple<long, long>>& data)
89{
90 auto [strength, length] = strongest_and_longest(data);
91 cout << "Part2: " << strength << '\n';
92}
93
94} // namespace
95
96int
97main()
98{
99 auto data = read_file("data/day24.txt");
100 part1(data);
101 part2(data);
102}