Посмотрите на это изображение. В частности, как расположены отверстия на концах.
Обратите внимание, как трубы на этом изображении упакованы в шестиугольную форму. Известно, что в 2D гексагональная решетка является самой плотной упаковкой окружностей. В этой задаче мы сосредоточимся на минимизации периметра упаковки кругов. Один из полезных способов визуализации периметра состоит в том, чтобы наложить круг вокруг круглой резинки.
Задание
Учитывая положительное целое число в n
качестве входных данных, покажите коллекцию n
окружностей, упакованных как можно плотнее.
Правила и разъяснения
- Предположим, что круги имеют диаметр 1 единицу.
- Переменная быть сведена к минимуму длина периметра, который определен , чтобы быть выпуклой оболочкой из центров окружностей в группе. Посмотрите на это изображение:
Три круга по прямой линии имеют периметр 4 (выпуклый корпус представляет собой прямоугольник 2x0, а число 2 считается дважды), те, которые расположены под углом 120 градусов, имеют периметр около 3,85, а треугольник имеет периметр всего 3 единицы. Обратите внимание, что я игнорирую дополнительные единицы пи, которыми будет фактический периметр, потому что я смотрю только на центры окружностей, а не на их края.
- Там может (и почти наверняка будет) несколько решений для любого данного
n
. Вы можете вывести любой из них по своему усмотрению. Ориентация не имеет значения. - Круги должны быть на гексагональной решетке.
- Круги должны быть не менее 10 пикселей в диаметре и могут быть заполнены или нет.
- Вы можете написать либо программу, либо функцию.
- Ввод может быть взят через STDIN, в качестве аргумента функции или ближайшего аналога.
- Вывод может отображаться или выводиться в файл.
Примеры
Ниже приведен пример допустимых и недействительных выходов для n от 1 до 10 (допустимые примеры только для первых пяти). Действительные примеры слева; каждый пример справа имеет больший периметр, чем соответствующий действительный пример.
Большое спасибо Steveverrill за помощь в написании этой задачи. Удачной упаковки!