Идет девятнадцатый день Пришествия кода, и мы ищем оптимальный план создания робота. Я призываю вас сначала попробовать решить ее самостоятельно https://adventofcode.com.
Вход
Наш вклад сегодня представляет собой серию чертежей. Мы создадим пользовательский тип для представления схемы и примем входные данные как std::vector<Blueprint>
.
В поисках наилучшего результата
Цель на сегодня — определить максимальное количество жеодов, которое мы можем собрать, учитывая чертеж конкретного робота.
Поскольку мы ищем оптимальный результат, наш самый простой подход — это полный перебор; однако это создает проблему. В любой момент у нас есть до пяти вариантов: построить одного из четырех роботов или просто добыть. При 24 единицах времени это означает пять в степени двадцать четыре, что совершенно невозможно.
Нам потребуется значительное сокращение пространства поиска, и для начала мы сможем избежать создания ненужных роботов. Примечательно, что, поскольку мы можем построить только одного робота в единицу времени, никогда не нужно иметь больше производящих роботов, чем стоимость создания одного робота.
Мы можем закодировать эту логику в структуру данных State, которая предоставит методы для определения того, можем ли мы построить робота, должны ли мы построить робота и, наконец, модифицирующие методы для создания робота и майнинга.
С этим мы можем построить наш алгоритм поиска.
Чтобы еще больше уменьшить пространство поиска, мы можем жадно строить геодезических роботов и даже роботов из обсидиана (что особенно важно для второй части). Жадно строить роботов из обсидиана немного опасно, так как может быть крайний случай, когда это не оптимальный ход; тем не менее, это сработало для моего ввода.
Ссылки
Репозиторий с полным решением (включая парсинг ввода) доступен здесь: https://github.com/HappyCerberus/moderncpp-aoc-2022.
Я ежедневно размещаю контент на современном C++ в Twitter, LinkedIn, Mastodon, Medium и Substack.