@@ -19,76 +19,51 @@ bool is_in_grid(const Pos& p, const Data& data) {
19
19
return p.x >= 0 && p.y >= 0 && p.x < data.map [0 ].size () && p.y < data.map .size ();
20
20
}
21
21
22
- std::set<Pos> find_nines (
22
+ std::pair<std:: set<Pos>, int > find_nines (
23
23
Pos cur,
24
- std::map<Pos, std::set<Pos>>& leads_to_nine,
24
+ std::map<Pos, std::pair<std:: set<Pos>, int >>& leads_to_nine,
25
25
const Data& data) {
26
- if (!leads_to_nine.contains (cur)) {
27
- leads_to_nine[cur] = {};
28
- }
29
- else {
26
+ if (leads_to_nine.contains (cur)) {
30
27
return leads_to_nine[cur];
31
28
}
29
+
32
30
int cur_val = data.map [cur.y ][cur.x ];
33
31
if (cur_val == 9 ) {
34
- leads_to_nine[cur]. insert ( cur) ;
32
+ leads_to_nine[cur] = {{ cur}, 1 } ;
35
33
return leads_to_nine[cur];
36
34
}
37
35
36
+ leads_to_nine[cur] = {};
38
37
for (auto & dir: directions) {
39
38
auto next = cur + dir;
40
39
if (is_in_grid (next, data) && data.map [next.y ][next.x ] - 1 == cur_val) {
41
40
auto result = find_nines (next, leads_to_nine, data);
42
- for (auto & r : result) {
43
- leads_to_nine[cur].insert (r);
44
- }
41
+ leads_to_nine[cur].first .insert (result.first .begin (), result.first .end ());
42
+ leads_to_nine[cur].second += result.second ;
45
43
}
46
44
}
47
45
48
46
return leads_to_nine[cur];
49
47
}
50
48
51
- int all_trails (
52
- Pos cur,
53
- std::map<Pos, int >& leads_to_nine,
54
- const Data& data) {
55
- if (leads_to_nine.contains (cur)) {
56
- return leads_to_nine[cur];
57
- }
58
- int cur_val = data.map [cur.y ][cur.x ];
59
- if (cur_val == 9 ) {
60
- return 1 ;
61
- }
62
-
63
- int total = 0 ;
64
- for (auto & dir: directions) {
65
- auto next = cur + dir;
66
- if (is_in_grid (next, data) && data.map [next.y ][next.x ] - 1 == cur_val) {
67
- total += all_trails (next, leads_to_nine, data);
68
- }
69
- }
70
-
71
- return total;
72
- }
73
-
74
49
int part1 (const Data &data)
75
50
{
76
- std::map<Pos, std::set<Pos>> leads_to_nine;
51
+ std::map<Pos, std::pair<std:: set<Pos>, int >> leads_to_nine;
77
52
78
53
int sum = 0 ;
79
54
for (auto & zero : data.zeros ) {
80
- sum += find_nines (zero, leads_to_nine, data).size ();
55
+ sum += find_nines (zero, leads_to_nine, data).first . size ();
81
56
}
82
57
return sum;
83
58
}
84
59
85
60
int part2 (const Data &data)
86
61
{
87
- std::map<Pos, int > leads_to_nine;
62
+ std::map<Pos, std::pair<std::set<Pos>, int > > leads_to_nine;
88
63
89
64
int sum = 0 ;
90
65
for (auto & zero : data.zeros ) {
91
- sum += all_trails (zero, leads_to_nine, data);
66
+ sum += find_nines (zero, leads_to_nine, data). second ;
92
67
}
93
68
return sum;
94
69
}
@@ -157,7 +132,7 @@ int main(int argc, char **argv)
157
132
Data data = parse ();
158
133
159
134
int answer1 = 574 ;
160
- int answer2 = 0 ;
135
+ int answer2 = 1238 ;
161
136
162
137
auto first = part1 (data);
163
138
std::cout << " Part 1: " << first << std::endl;
0 commit comments