Files
AdventOfCode/src/2021/Day09.cpp
T
2025-11-30 16:30:12 +01:00

92 lines
2.2 KiB
C++

#include "common/aoc.h"
namespace y2021::day09
{
REGISTER_DAY(2021, Day09, Array2D<int>, int);
REGISTER_TEST_EXAMPLE(2021, Day09, ExampleInput, 1, 15);
REGISTER_TEST(2021, Day09, Input, 1, 478);
REGISTER_TEST_EXAMPLE(2021, Day09, ExampleInput, 2, 1134);
REGISTER_TEST(2021, Day09, Input, 2, 1327014);
READ_INPUT(input)
{
return Input::ReadDigitsAsArray2D(input);
}
OUTPUT1(input)
{
int count = 0;
Index2D index{0, 0};
for (auto& val : input)
{
Index2D indices[4]{
{index.x - 1, index.y}, {index.x, index.y - 1}, {index.x + 1, index.y}, {index.x, index.y + 1}};
bool all = true;
for (auto& ind : indices)
{
if (input.IsInside(ind) && input[ind] <= val)
{
all = false;
break;
}
}
if (all)
count += val + 1;
input.Increment(index);
}
return count;
}
OUTPUT2(input)
{
std::vector<Index2D> basins;
Index2D index{0, 0};
for (auto& val : input)
{
Index2D indices[4]{
{index.x - 1, index.y}, {index.x, index.y - 1}, {index.x + 1, index.y}, {index.x, index.y + 1}};
bool all = true;
for (auto& ind : indices)
{
if (input.IsInside(ind) && input[ind] <= val)
{
all = false;
break;
}
}
if (all)
basins.emplace_back(index);
input.Increment(index);
}
std::vector<int> numbers;
for (auto&& basin : basins)
{
std::stack<Index2D> stack;
std::set<Index2D> visited;
stack.emplace(basin);
visited.emplace(basin);
while (!stack.empty())
{
auto index = stack.top();
stack.pop();
Index2D indices[4]{
{index.x - 1, index.y}, {index.x, index.y - 1}, {index.x + 1, index.y}, {index.x, index.y + 1}};
for (auto&& ind : indices)
{
if (input.IsInside(ind) && input[ind] != 9 && visited.find(ind) == visited.end())
{
stack.emplace(ind);
visited.emplace(ind);
}
}
}
numbers.emplace_back(visited.size());
}
std::sort(numbers.begin(), numbers.end());
return numbers[numbers.size() - 1] * numbers[numbers.size() - 2] * numbers[numbers.size() - 3];
}
}