diff --git a/2022/12.cpp b/2022/12.cpp index bd5e6f4..6ac570a 100644 --- a/2022/12.cpp +++ b/2022/12.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -16,55 +17,47 @@ using aocpp::Grid; namespace { -auto Parse(std::istream & in) -> std::tuple +auto Parse(std::istream & in) -> std::tuple, Coord, Grid> { - Coord start {}; + Coord start1 {}; + std::vector starts2; Coord end {}; auto grid = Grid::Parse(in); grid.each([&](Coord c, char v) { switch (v) { - case 'S': grid[c] = 'a'; start = c; break; + case 'S': grid[c] = 'a'; start1 = c; break; case 'E': grid[c] = 'z'; end = c; break; + case 'a': starts2.push_back(c); break; } }); - return {start, end, std::move(grid)}; + return {start1, std::move(starts2), end, std::move(grid)}; } -auto Solve(std::vector starts, Coord end, Grid const& grid) -> std::int64_t +auto Solve(std::vector starts, Coord end, Grid const& grid) -> std::optional { - std::vector prev_layer(std::move(starts)); std::vector next_layer; std::set seen; std::int64_t counter {1}; - while (!prev_layer.empty()) { - for (auto here : prev_layer) { + while (!starts.empty()) { + for (auto here : starts) { if (!seen.insert(here).second) continue; auto here_height = grid[here]; for (auto next : {Up(here), Down(here), Left(here), Right(here)}) { if (!grid.contains(next)) continue; - if (grid[next] - here_height > 1) continue; + if (grid[next] - 1 > here_height) continue; if (next == end) { return counter; } next_layer.push_back(next); } } counter++; - prev_layer.clear(); - std::swap(prev_layer, next_layer); + starts.clear(); + std::swap(starts, next_layer); } - return -1; -} - -auto Part2Starts(Grid const& grid) -> std::vector -{ - std::vector starts; - grid.each([&](Coord c, char v) { - if (v == 'a') starts.push_back(c); - }); - return starts; + return {}; } } // namespace @@ -78,15 +71,15 @@ TEST_SUITE("2022-12 examples") { "acctuvwj\n" "abdefghi\n" }; - auto [start, end, grid] = Parse(in); - CHECK(31 == Solve({start}, end, grid)); - CHECK(29 == Solve(Part2Starts(grid), end, grid)); + auto [start1, starts2, end, grid] = Parse(in); + CHECK(31 == Solve({start1}, end, grid)); + CHECK(29 == Solve(std::move(starts2), end, grid)); } } auto Main(std::istream & in, std::ostream & out) -> void { - auto const [start, end, grid] = Parse(in); - out << "Part 1: " << Solve({start}, end, grid) << std::endl; - out << "Part 2: " << Solve(Part2Starts(grid), end, grid) << std::endl; + auto [start1, starts2, end, grid] = Parse(in); + out << "Part 1: " << Solve({start1}, end, grid).value_or(-1) << std::endl; + out << "Part 2: " << Solve(std::move(starts2), end, grid).value_or(-1) << std::endl; }