#include "aoc.h" #include namespace aoc2022 { static int maxx = 0; static int maxy = 0; static int maxz = 0; bool is_valid(droplet d, cube& c) { bool bx = d.x >= 0 && d.x < maxx + 1; bool by = d.y >= 0 && d.y < maxy + 1; bool bz = d.z >= 0 && d.z < maxz + 1; return bx && by && bz && c.get(d.x, d.y, d.z) == 0; } // flood void flood(cube& c) { std::deque q; c.get(0, 0, 0) = -1; q.push_back(droplet{0, 0, 0}); while (!q.empty()) { auto s = q.size(); while (s-- > 0) { auto d = q.front(); q.pop_front(); droplet ds[] = { {d.x + 1, d.y, d.z}, {d.x - 1, d.y, d.z}, {d.x, d.y + 1, d.z}, {d.x, d.y - 1, d.z}, {d.x, d.y, d.z + 1}, {d.x, d.y, d.z - 1}, }; for (auto& dx : ds) { if (is_valid(dx, c)) { c.get(dx.x, dx.y, dx.z) = -1; q.push_back(dx); } } } } } std::pair day18(line_view file) { std::vector ds; per_line(file, [&ds](line_view lv) { droplet d{lv}; maxx = std::max(maxx, d.x); maxy = std::max(maxy, d.y); maxz = std::max(maxz, d.z); ds.emplace_back(d); return true; }); cube c{maxx + 1, maxy + 1, maxz + 1}; for (auto& d : ds) { c.get(d.x, d.y, d.z) = 1; } flood(c); int t0{0}, t1{0}; std::vector dx; c.traverse([&t0, &dx, &c](int x, int y, int z) { if (c.get(x, y, z) == 1) { t0 += 6; t0 -= c.get(x - 1, y, z) == 1 ? 1 : 0; t0 -= c.get(x + 1, y, z) == 1 ? 1 : 0; t0 -= c.get(x, y - 1, z) == 1 ? 1 : 0; t0 -= c.get(x, y + 1, z) == 1 ? 1 : 0; t0 -= c.get(x, y, z - 1) == 1 ? 1 : 0; t0 -= c.get(x, y, z + 1) == 1 ? 1 : 0; } if (c.get(x, y, z) == 0) { dx.emplace_back(x, y, z); } }); for (auto& d : dx) { c.get(d.x, d.y, d.z) = 1; } c.traverse([&t1, &c](int x, int y, int z) { if (c.get(x, y, z) == 1) { t1 += 6; t1 -= c.get(x - 1, y, z) == 1 ? 1 : 0; t1 -= c.get(x + 1, y, z) == 1 ? 1 : 0; t1 -= c.get(x, y - 1, z) == 1 ? 1 : 0; t1 -= c.get(x, y + 1, z) == 1 ? 1 : 0; t1 -= c.get(x, y, z - 1) == 1 ? 1 : 0; t1 -= c.get(x, y, z + 1) == 1 ? 1 : 0; } }); // printf("%d %d\n", t0, t1); return {t0, t1}; } } // namespace aoc2022