Russian Qt Forum

Программирование => Алгоритмы => Тема начата: CuteBunny от Июнь 13, 2012, 15:38



Название: Упаковка прямоугольников в прямоугольник
Отправлено: CuteBunny от Июнь 13, 2012, 15:38
Задача: дан прямоугольник с w, h. Его нужно заполнить максимальным кол-вом маленьких прямоугольников из n, с wi, hi, где i >=1 && i <= n, используя все имеющееся пространство, при чем маленькие прямоугольники не должны пересекаться внутри большого.

Как это сделать без трансформаций, без оптимизаций, самым прямым и доступным алгоритмом?

Спасибо.


Название: Re: Упаковка прямоугольников в прямоугольник
Отправлено: Igors от Июнь 13, 2012, 16:20
Здесь трудности с understand'ом

Может быть все таки "куб" с размерами по осям (c, w, h) если у этих размеров 3 и Вы говорите о пространстве?
Если "наибольшим количеством" значит "оптимальное заполнение" то задача выглядит слишком сложной. Наверное речь идет просто о заполнении большого куба непересекающимися кубиками из набора. А уж "наибольшим" или нет - как получится

- извлекаем наибольший куб из набора и с ставим его в угол вмещающего. Не влезает - пробуем другой. В результате получается несколько новых свободных кубов. Для них повторяем процедуру расстановки рекурсивно. Ну вот и все


Название: Re: Упаковка прямоугольников в прямоугольник
Отправлено: CuteBunny от Июнь 13, 2012, 16:51
Да мне бы с прямоугольниками разобраться для начала...:)


Название: Re: Упаковка прямоугольников в прямоугольник
Отправлено: Igors от Июнь 13, 2012, 17:06
Все то же самое, только 2 размера вместо 3


Название: Re: Упаковка прямоугольников в прямоугольник
Отправлено: CuteBunny от Июнь 15, 2012, 11:40
Вроде сделал...

Правда без рекурсий.

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

Не самый наверное все-таки оптимальный вариант, т.к. я два раза делаю полный перебор всех имеющихся прямоугольников, т.е. сложность алгоритма в худшем случае составит O(n^2).

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

На моей машине прямоугольник 300x300 заполняется рэндомными прямоугольниками ~1с.