From 3c3a1edd61407fd4d6831167d82551b2bc2602be Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Wed, 21 Dec 2022 10:59:49 +0000 Subject: [PATCH] Optimize 2018 day 6 part 2. Basically tighten the search parameters. --- 2018/puzzle-06-02.cc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/2018/puzzle-06-02.cc b/2018/puzzle-06-02.cc index d083a26..c65b8e6 100644 --- a/2018/puzzle-06-02.cc +++ b/2018/puzzle-06-02.cc @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -53,6 +54,11 @@ auto main() -> int Point max(0, 0); std::regex const re{"(\\d+), (\\d+)"}; + Int const safe_distance{10'000}; + // At the edge of the grid (0,0) or (max,max) what is the largest possible sum of distances we + // could have. + Int edge_distance{0}; + // Read data while (std::getline(std::cin, line)) { std::smatch m; @@ -62,18 +68,17 @@ auto main() -> int } Point const pt(std::stoll(m.str(1)), std::stoll(m.str(2))); point_map.insert({pt, 0}); + edge_distance += pt.first + pt.second; max.first = std::max(max.first, pt.first); max.second = std::max(max.second, pt.second); } - // Examine each point within the grid. We go over the top just to be safe - Int const safe_distance{10'000}; Int region_size{0}; - for (Int x{max.first - safe_distance - 1}; x <= safe_distance + 1; ++x) { - if (x % 1000 == 0) { - std::cout << "x: " << x << "\n"; - } - for (Int y{max.second - safe_distance - 1}; y <= safe_distance + 1; ++y) { + // Edge distance now becomes how far we have to go beyond the edge of the grid to ensure we count + // all bits of the grid. + edge_distance = (edge_distance > safe_distance) ? 0 : safe_distance - edge_distance; + for (Int x{-edge_distance}; x <= max.first + edge_distance; ++x) { + for (Int y{-edge_distance}; y <= max.second + edge_distance; ++y) { if (within_distance(point_map.begin(), point_map.end(), Point(x, y), safe_distance)) { ++region_size; }