diff options
| author | kdx <kikoodx@paranoici.org> | 2024-12-12 06:58:42 +0100 |
|---|---|---|
| committer | kdx <kikoodx@paranoici.org> | 2024-12-12 06:58:42 +0100 |
| commit | a1805f7a1879b7a29dab7427d42451f0df28abb2 (patch) | |
| tree | 23c11f219530ce3d6f7a35d3e13e76cf1ef7482c | |
| parent | b78cd13db05db22e0f73d8adce40aa2af61de918 (diff) | |
| download | aoc2024-main.tar.gz | |
| -rw-r--r-- | 12/main.cpp | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/12/main.cpp b/12/main.cpp index 87d0643..0c6745e 100644 --- a/12/main.cpp +++ b/12/main.cpp @@ -1,48 +1,57 @@ vector<string> lines; int w, h; -char get(int x, int y) { +static char get(int x, int y) { if (x < 0 || y < 0 || x >= w || y >= h) return 0; return lines[y][x]; } -void set(int x, int y, char v) { +static void set(int x, int y, char v) { if (x < 0 || y < 0 || x >= w || y >= h) return; lines[y][x] = v; } -bool kind(int x, int y, char c) { - return get(x, y) == c || get(x, y) == '.'; -} - -pair<int, int> extract(int x, int y, char c) { +static int extract(int x, int y, char c) { if (get(x, y) != c) - return make_pair(0, 0); + return 0; int area = 1; - int perimeter = 0; set(x, y, '.'); - perimeter += !kind(x - 1, y, c); - perimeter += !kind(x + 1, y, c); - perimeter += !kind(x, y - 1, c); - perimeter += !kind(x, y + 1, c); -#define X(OX,OY) \ - { \ - auto p = extract(x + OX, y + OY, c); \ - area += p.first; \ - perimeter += p.second; \ - } +#define X(OX,OY) area += extract(x + OX, y + OY, c) X(-1, 0); X(1, 0); X(0, -1); X(0, 1); #undef X - return make_pair(area, perimeter); + return area; +} + +static int csides() { + int sides = 0; +#define X(OX, OY, A, B, C, D) \ + for (auto A = 0; A < B; A++) { \ + for (auto C = 0; C < D; C++) { \ + bool side = false; \ + for (;;) { \ + if (get(x, y) != '.' || get(x + OX, y + OY) == '.') \ + break; \ + side = true; \ + C += 1; \ + } \ + if (side) sides += 1; \ + } \ + } + X(0, 1, y, h, x, w); + X(0, -1, y, h, x, w); + X(1, 0, x, w, y, h); + X(-1, 0, x, w, y, h); +#undef X + return sides; } int main() { @@ -51,8 +60,9 @@ int main() { for (auto y = 0; y < h; y++) { for (auto x = 0; x < w; x++) { if (!get(x, y)) continue; - auto info = extract(x, y, get(x, y)); - result += info.first * info.second; + auto area = extract(x, y, get(x, y)); + auto sides = csides(); + result += area * sides; for (auto &line : lines) for (auto &c : line) if (c == '.') |