Посмотрите на это изображение. В частности, как расположены отверстия на концах.
Обратите внимание, как трубы на этом изображении упакованы в шестиугольную форму. Известно, что в 2D гексагональная решетка является самой плотной упаковкой окружностей. В этой задаче мы сосредоточимся на минимизации периметра упаковки кругов. Один из полезных способов визуализации периметра состоит в том, чтобы наложить круг вокруг круглой резинки.
Задание
Учитывая положительное целое число в n
качестве входных данных, покажите коллекцию n
окружностей, упакованных как можно плотнее.
Правила и разъяснения
- Предположим, что круги имеют диаметр 1 единицу.
- Переменная быть сведена к минимуму длина периметра, который определен , чтобы быть выпуклой оболочкой из центров окружностей в группе. Посмотрите на это изображение:
Три круга по прямой линии имеют периметр 4 (выпуклый корпус представляет собой прямоугольник 2x0, а число 2 считается дважды), те, которые расположены под углом 120 градусов, имеют периметр около 3,85, а треугольник имеет периметр всего 3 единицы. Обратите внимание, что я игнорирую дополнительные единицы пи, которыми будет фактический периметр, потому что я смотрю только на центры окружностей, а не на их края.
- Там может (и почти наверняка будет) несколько решений для любого данного
n
. Вы можете вывести любой из них по своему усмотрению. Ориентация не имеет значения. - Круги должны быть на гексагональной решетке.
- Круги должны быть не менее 10 пикселей в диаметре и могут быть заполнены или нет.
- Вы можете написать либо программу, либо функцию.
- Ввод может быть взят через STDIN, в качестве аргумента функции или ближайшего аналога.
- Вывод может отображаться или выводиться в файл.
Примеры
Ниже приведен пример допустимых и недействительных выходов для n от 1 до 10 (допустимые примеры только для первых пяти). Действительные примеры слева; каждый пример справа имеет больший периметр, чем соответствующий действительный пример.
Большое спасибо Steveverrill за помощь в написании этой задачи. Удачной упаковки!
источник
Ответы:
Mathematica
295950 байтПримечание. В этой версии, которая еще только для игры в гольф, рассматриваются проблемы, поднятые Стивом Мерриллом в связи с моими более ранними попытками.
Хотя это и является улучшением по сравнению с первой версией, он не найдет наиболее плотную конфигурацию рукоятки, где можно было бы искать круглую, а не шестиугольную общую форму.
Он находит решения путем построения полного внутреннего шестиугольника (для n> = 6, а затем проверяет все конфигурации для завершения внешней оболочки с оставшимися кругами.
Интересно, что, как отметил Стив Меррилл в комментариях, решение для
n+1
кругов не всегда состоит из решения для n кругов с добавлением еще одного круга. Сравните данное решение для 30 кругов с данным решением для 31 кругов. (Примечание: существует уникальное решение для 30 кругов.)Некоторые проверки повлекли за собой сравнение более ста тысяч случаев для одного значения n (включая симметрии). Потребовалось приблизительно 5 минут, чтобы выполнить всего 34 тестовых случая. Само собой разумеется, что при более широком
n's
подходе этот метод грубой силы вскоре окажется непрактичным. Существуют более эффективные подходы.Цифры справа от каждой упаковки являются периметрами соответствующих синих выпуклых корпусов. Ниже вывод для
3 < n < 35
. Красные круги - это те, которые добавляются вокруг правильного шестиугольника.источник