На восемнадцатый день Advent of Code мы работаем с вокселями, чтобы рассчитать поверхность капель лавы. Я призываю вас сначала попробовать решить ее самостоятельно https://adventofcode.com.

Вход

Наш вход сегодня представляет собой серию кубиков. Мы создадим пользовательский тип для представления куба и примем входные данные как std::vector<Cube>.

Подсчет непокрытых сторон

В первой части нам нужно подсчитать общее количество сторон наших вокселей лавы, которые не покрыты другими вокселями.

Так как мы работаем с небольшим количеством кубов, мы можем выполнить полный перебор, перебирая соседей каждого куба и проверяя, существует ли такой куб в наших входных данных.

Если такого куба нет, то эта сторона куба не покрыта, и наоборот.

Игнорирование внутренних карманов

Часть вторая добавляет значительное осложнение. Нам нужно только посчитать стороны, соприкасающиеся с внешним пространством, и игнорировать внутренние карманы.

К счастью, мы работаем с небольшим количеством кубов и небольшим пространством (19x19x19 для моего ввода). Следовательно, мы можем использовать полный перебор (исследуя внешнее пространство) и подсчитывать стороны кубов, с которыми мы сталкиваемся.

Мы будем искать в пространстве на один куб больше в каждом измерении (21x21x21 для моего ввода), начиная с одного из углов, используя поиск в ширину.

Ссылки

Репозиторий с полным решением (включая парсинг ввода) доступен здесь: https://github.com/HappyCerberus/moderncpp-aoc-2022.

Я ежедневно размещаю контент на современном C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.