|
|
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Дано прямоугольник (x1,y1,x2,y2) Rect_Big Есть более мелкий прямоугольник ( заготовка) Rect_x Известен только его размер. w1, h1. в произвольном порядке накидали 5 элементов Rect_x в Rect_Big. Надо положить шестой на свободное место ( не закрывая другие 5 Rect_x) в Rect_Big. Как вычислить эту свободную нычку? Если ее нет, то не добавлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 03:59 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Если взять по простому то задачку можно попробовать решить так: 1 - берем 2 любых из 5 прямоугольников. 2 - берем крайние координаты, скажем если первый выше второго то надо взять левый нижний угол у первого и верхний правый в у второго если разница между координатами X будет больше ширины вписываемого и разница между Y больше высоту вписываемого то ляпай в любо место между двумя прямоугольниками. 3 - и так далее перебираем расстояния между границами прямоугольников, не забываю проверять что бы другие прямоугольники уже не находились в этих границах. 4 - так же необходимо проверять расстояние от этих прямоугольников до границ "окна" примерно как то так - если посчитать все расстояния можно сделать вывод о том куда ляпнуть свободный прямоугольник www.aleksandr-pro.ru/images/primerno.gif ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 10:14 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Volochkova, стороны прямоугольников всегда параллельны осям координат? Rect_x может поворачиваться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 10:20 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Volochkova, множество возможных значений координат дискретно или непрерывно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 10:21 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Volochkovaв произвольном порядке накидали 5 элементов Rect_x в Rect_Big.При этом они могли перекрыться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 10:22 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
По-моему, это задача раскроя. Решается методами линейного программирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 10:54 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
green_2005По-моему, это задача раскроя. Решается методами линейного программирования.Можно, конечно, и линейным, но как-то из пушки по воробьям. Я бы решал "теорией голодной козы", построив геометрическое место точек, где может находиться центр нового прямоугольника. То есть я бы внешний прямоугольник уменьшил на w1 по ширине и h1 по высоте (получил бы (x1+0.5*w1, y1+0.5*h1, x2-0.5*w1, y2-0.5*h1), в него накидал аналогично увеличенных мелких прямоугольников, где внешний прямоугольник оказался не закрыт, там можно разместить центр нового прямоугольника. Если новый можно крутить, то повторить процедуру, поменяв w1 и h1 местами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 11:55 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Volochkova, Предлагаю продолжить методом Монте-Карло: Так же произвольно, как и первые пять, кидаем шестой прямоугольник. Если он лег удачно (без перекрытий) - так и оставляем. Если нет, повторяем еще раз до победного конца, но не более заранее оговоренного числа раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 11:55 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_Предлагаю продолжить методом Монте-Карло: Так же произвольно, как и первые пять, кидаем шестой прямоугольник. Если он лег удачно (без перекрытий) - так и оставляем. Если нет, повторяем еще раз до победного конца, но не более заранее оговоренного числа раз.Предлагаю так суда грузить. Кидаем трактор в трюм. Если он лег удачно (без перекрытий) - так и оставляем. Если нет, повторяем еще раз до победного конца, но не более заранее оговоренного числа раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:01 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ru Предлагаю так суда грузить. Кидаем трактор в трюм. Если он лег удачно (без перекрытий) - так и оставляем. Если нет, повторяем еще раз до победного конца, но не более заранее оговоренного числа раз. А оно разве грузится как-то по-другому? Я недавно мебель перевозил. Впечатления еще свежие. Кстати, у топикстартера идет речь именно о первоначальном произвольном размещении прямоугольников. При этом опущены некоторые детали (параллельны ли стороны больших и малых прямоугольников). По-моему дальнейшее случайное размещение вполне логично. Если Монте-Карло не подходит, то можно эвристики предложить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:11 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_iv_an_ru Предлагаю так суда грузить. Кидаем трактор в трюм. Если он лег удачно (без перекрытий) - так и оставляем. Если нет, повторяем еще раз до победного конца, но не более заранее оговоренного числа раз.А оно разве грузится как-то по-другому?Академик Крылов в своих мемуарах подробно описывает загрузку некоторых сухогрузов как своё отдельное серьёзное достижение. А вообще почти всегода стивидором рулит дяденька с профильным в/о и хорошим стажем.[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:28 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Навскидку можно так (насчет оптимальности большие сомнения): 1) Создаем некую древовидную структуру-индекс, для быстрого нахождения прямоугольника Rect_x по точке внутри него (как именно - надо уточнять). Т.е. имеется точка, надо выяснить, в каком она прямоугольнике. Хотя если количество их так и останется 5, то этот пункт необязателен. 2) Устанавливаем X=x1, Y = y1. 3) Пока Х <= x2-w1: 4) Пока Y <= y2-h1: Проверяем возможность разместить прямоугольник от точки (X, Y) (а именно попадание красных точек в имеющиеся прямоугольники). Если получилось - усё, приехали. Иначе запоминаем наименьший правый край из помешавших прямоугольников (R), их наибольший bottom (B) и делаем Y = B, возврат к п. 4. 5) Из всех R берем наименьший (r), делаем X = r, возврат к п. 3. Тут, конечно, неизбежны повторные проверки, но гарантируется конечное число ходов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:29 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
У нас пошел разговор в стиле: "А если вы бочку друг на друга надумаете катить, то это уже контейнерные перевозки, это вам в "Трансагенство"..." Я только руководил разгрузкой одинаковых вагонов с одинаковыми грузами (бумага). Так вот, все вагоны были загружены как-то по особому. Число единиц груза было всегда разным. В журнале "Текстильная промышленность" когда-то была рассмотрена оптимизация распроя полотна на прямоугольные заготовки. Там очень подробно эвристики были рассмотрены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:34 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_, Раскрой одно время был вообще модной темой, (а распил ещё моднее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:38 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Volochkova... При каждом добавлении нового нужно доказывать формальную возможность положить шестой. Тоесть для данного случая к примеру, уже после 1 швыряния куска прямоугольника шестой положить никак невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:39 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ru, Главный вывод из той статьи: Задача раскроя не имеет внятного аналитического решения. Поэтому и возились с эвристиками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:43 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Яростный МечНавскидку можно так (насчет оптимальности большие сомнения): У меня тоже. Можно быстрее. 1. Мысленно растягиваем отрезки-стороны маленьких прямоугольников так, чтобы они упёрлись в края экрана. То есть каждый прямоугольник превращается в эдакую '#'. 2. Теперь весь большой прямоугольник разграфлён на клеточки разного размера. Если координаты нигде не повторяются, то клеточек будет 13*13=169, если повторяются то меньше. Вполне мелкая матрица. 3. Делаем целочисленную матрицу такого размера, заливаем нулями, потом "рисуем" в ней уже имеющиеся прямоугольники, забивая целое число клеточек номером прямоугольника. 4. Теперь не проблема пробежаться по матрице, разыскивая прямоугольник нулей подходящих габаритов. Этот алгоритм юзался до Win2000 включительно в оконной системе, потом наши Нские люди предложили более быстрый, который я тут повешусь расписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:49 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_Главный вывод из той статьи: Задача раскроя не имеет внятного аналитического решения. Поэтому и возились с эвристиками.Ясен пень, раз одномерные задачи о ранцах и то сплошь NP-противные, двумерный аналог тем более будет NP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:52 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Я предлагаю следующий вариант: (Предполагается, что все малые прямоугольники выкладываются параллельно сторонам большого и направление больших и малых сторон у всех совпадает) Берем очередной уже выложенный прямоугольник. Пытаемся выложить новый прямоугольник, размещая его в притык к стороне и к углу. Всего 8 возможных вариантов. Если есть перекрытие с другими прямоугольниками - переходим к следующему варианту. Иначе - удалось разместить. Перебираем все исходные пять прямоугольников. Если разместить не удалось - нычки нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:54 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Думаю, нейросеть решит эту задачу быстре чем NP но придётся пожертвовать аналитической точностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:56 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_, Прямоугольники пытаемся размещать как красные на рисунке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:58 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_Пытаемся выложить новый прямоугольник, размещая его в притык к стороне и к углу. Всего 8 возможных вариантов. Не совсем понял, но мне кажется, это отклонение от ТЗ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 12:59 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_, Ваш вариант не сможет впихнуть 6-й (зеленый) прямоугольник ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 13:28 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Яростный Меч, Ой! (Тогда остается Монте-Карло) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 14:10 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
щас прикинул по своему варианту - самый худший случай примерно N^2 поисков прямоугольников по точке. Не так плохо (по крайней мере, не NP). + память под структуру для быстрого поиска, но это копейки для современных компов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 14:20 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_Ой! (Тогда остается Монте-Карло) +1 Тоже неплохой метод когда нужно асимтотически оценить что-нибудь и ответ выдать мгновенно в первые-же секунды работы алгоритма. В параллель с работающим NP-сложныйм методом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 16:17 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
_some_Яростный Меч, Ой! (Тогда остается Монте-Карло) Попробуйте монте-карлой сложить два квадрата 100x100 впихнуть в одну коробку 100x200. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 18:32 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ru, Оно, конечно же, не запрещено. Только тогда лучше метод Лас-Вегаса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2010, 20:11 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Прямоугольники строго идут параллельно осям координат. Никаких там под углом и т.д. Блин, неужели так все сложно... Размеры прямоугольников всегда одинаковые. Допустимо касание прямоугольников. хоть в цикле идти со смещением и перебором искать область. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 02:38 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
VolochkovaБлин, неужели так все сложно...А чем вам вариант от iv_an_ru не нравится? Мне этот вариант наиболее симпатичен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 09:09 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Да. Вариант iv_an_ru из бюджетных - наиболее оптимальный. Другие варианты будут скорее всего за деньги. Волочкова, вам всё понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 10:35 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Задача решается алгоритмом из семейства line-sweep. Наброски решения (только в несколько иной формулировке) -- здесь (секция "Area of the union of rectangles"). Вкратце: она элементарно сводится к поиску множества точек прямоугольника (см. первый пост iv_an_ru), не принадлежащих объединению множества других прямоугольников; левые и правые рёбра этих прямоугольников сортируются по возрастанию, после чего некая воображаемая линия "сканирует" их слева на право, между любыми двумя соседними линиями легко строится множество "свободных" точек, не принадлежащих ни одному прямоугольнику. Думаю, это оптимальный алгоритм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:20 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotлевые и правые рёбра этих прямоугольников сортируются по возрастаниюПо возрастанию чего? длины? - так они все одинаковой длины. А вообще это не алгоритм, а поток сознания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:25 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
miksoftПо возрастанию чего? длины? - так они все одинаковой длины. А вообще это не алгоритм, а поток сознания. По возрастанию абсциссы, очевидно (написал я, пожалуй, криво, но если б Вы прошли по указанной ссылке, то сразу поняли бы о чём речь). Если Вы не знаете такой техники, то лучше отправляйтесь штудировать педивикию хотя бы %) техника в ряде задач очень полезна, например -- в данной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:29 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotЗадача решается алгоритмом из семейства line-sweep. Наброски решения (только в несколько иной формулировке) -- здесь (секция "Area of the union of rectangles"). Вкратце: она элементарно сводится к поиску множества точек прямоугольника (см. первый пост iv_an_ru), не принадлежащих объединению множества других прямоугольников; левые и правые рёбра этих прямоугольников сортируются по возрастанию, после чего некая воображаемая линия "сканирует" их слева на право, между любыми двумя соседними линиями легко строится множество "свободных" точек, не принадлежащих ни одному прямоугольнику. Думаю, это оптимальный алгоритм. Алгоритмы сканирования пикселей оптимальны только для сложных или очень-очень многочисленных фигур и --- сюрприз --- растра. У нас 6 очень простых фигур, и нигде не сказано, что у них координаты одновременно небольшие и целочисленные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:31 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ruАлгоритмы сканирования пикселей оптимальны только для сложных или очень-очень многочисленных фигур и --- сюрприз --- растра. У нас 6 очень простых фигур, и нигде не сказано, что у них координаты одновременно небольшие и целочисленные. Помилуйте, при чём здесь пиксели? Указанный алгоритм работает с непрерывными координатами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:35 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ruнигде не сказано, что у них координаты одновременно небольшие и целочисленные.А для вашего алгоритма это и не требуется. Достаточно ввести понятия "ширина столбца" и "высота строки". И кстати, матрица получится 11х11, а не 13х13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:36 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotiv_an_ruАлгоритмы сканирования пикселей оптимальны только для сложных или очень-очень многочисленных фигур и --- сюрприз --- растра. У нас 6 очень простых фигур, и нигде не сказано, что у них координаты одновременно небольшие и целочисленные. Помилуйте, при чём здесь пиксели? Указанный алгоритм работает с непрерывными координатами. Разумеется работает. Пока в вашей задаче вы ответ вычисляете, а подбираете вариант. Иначи возникают проблемы с эффективным хранением промежуточных данных. Можно, конечно, скрестить ужа с ежом --- сначала модифицировать исходные прямоугольники "голодной козой", а потом именно таким сканированием искать свободное место. Это будет хорошо работать в т.ч. для фигур сложной формы, а не только для параллельных осям "ящиков". Но это точно не быстрее обегания матрицы 11x11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:49 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ruМожно, конечно, скрестить ужа с ежом --- сначала модифицировать исходные прямоугольники "голодной козой", а потом именно таким сканированием искать свободное место. Это будет хорошо работать в т.ч. для фигур сложной формы, а не только для параллельных осям "ящиков". Но это точно не быстрее обегания матрицы 11x11. Вы не поняли алгоритма. Ну неужели так сложно пройти по указанным ссылкам? Для сложных фигур он вообще работать не будет, равно как и в случае поворота прямоугольников на угол, не кратный pi/2. Это не "сканирование" в обычном смысле, скачки между ближайшими вертикальными линиями (будь то левое или правое ребро какого-либо прямоугольника) происходят "мгновенно", за одну итерацию, что логично -- между ними множество "свободных" точек на вертикальной воображаемой линии остаётся неизменным, потому и никакой растр не нужен. Сложность алгоритма при правильном выборе структур данных -- O(N*logN). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 11:58 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotВы не поняли алгоритма. Это вы не поняли ещё не поняли свой будущий алгоритма до конца. junior idiotНу неужели так сложно пройти по указанным ссылкам? В этом пока что нет надобности, потому что у меня ещё не развился склероз. junior idiotДля сложных фигур он вообще работать не будет, равно как и в случае поворота прямоугольников на угол, не кратный pi/2. Сканирование как раз для любых многоугольников работать будет, а при извращении --- и для NURBS-ов. Но только если сначала "голодной козой" заменить исходные фигуры на их "запрещённые окрестности", а вставляемый прямоугольник --- на его центр из одной точки. Без этой замены задача очень противная, потому что поиск одной точки --- это одно, а отслеживание всех событий, происходящих в каждой движущейся прямоугольной "тени" каждого свободного в данный момент отрезка --- песнь лебяжья.[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 12:34 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ru, а вам не кажется нелепой ситуация, в которой вы меня уверяете в том, что я имею ввиду именно алгоритм сканирования, хотя я говорю про совершенно другой алгоритм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 12:49 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotiv_an_ru, а вам не кажется нелепой ситуация, в которой вы меня уверяете в том, что я имею ввиду именно алгоритм сканирования, хотя я говорю про совершенно другой алгоритм? Cтранно, ссылку даёте как раз на алгоритм сканирования по возрастающей координате с предварительной сортировкой событий по этой координате, сами пытаетесь высказать то же самое. Если вам кажется, что без "голодной козы" этот метод будет удобен --- попробуйте не абстрактную идею высказать, а продемонстрировать код. Чего проще, казалось бы --- взяли прямоугольники, составили общий сортированный список координат их левых и правых сторон, и бодро пошли циклом прям именно по этому списку, не пытаясь "подглядывать" в исходные данные для X отличных от значения текущего элемента списка. Ну так заранее огорчу --- там полезут вредные случаи, для которых надо будет городить как раз "память" для данных из уже пройденных координат, именно с указанием точного значения X, когда событие происходило. Или запоминать, какой именно номер прямоугольника связан с каким событием, и лазить в "двумерные" данные по ранее пройденным объектам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 14:04 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
iv_an_ruCтранно, ссылку даёте как раз на алгоритм сканирования по возрастающей координате с предварительной сортировкой событий по этой координате, сами пытаетесь высказать то же самое. Ага-ага. Теперь перечитайте свои пассажи про "произвольные фигуры". Про сортировку каких координат вы там писали? %))) iv_an_ruЕсли вам кажется, что без "голодной козы" этот метод будет удобен Не очень понял, чего вы так бегаете с этой козой. Переход от исходных прямоугольников и впихиваемого прямоугольника к новым "обрамлённым" прямоугольникам и впихиваемой точки -- очевиден настолько, что на фоне общего алгоритма совершенно не требует внимания, хотя я всё же указал, что его сделать нужно (см. мой первый же пост в этом топике). Как видно, задача сводится к поиску ГМТ внутри некоего обрамляющего прямоугольника (в общем случае -- плоскости), не принадлежащих ни одному заданному прямоугольнику (то есть, не принадлежащих их объединению, поиск которого -- классическая задачка для sweep line). iv_an_ru попробуйте не абстрактную идею высказать, а продемонстрировать код. Это не "абстрактная идея", а вполне конкретный алгоритм. Достаточно широко известный, чтобы легко гуглиться. Вот, например, одна из первых ссылок в гугле . С той лишь минимальной разницей, что между двумя событиями в данной задаче нас интересует не длина вертикальных отрезков, проходящих через хотя бы один прямоугольник, а множество вертикальных отрезков, не проходящих ни через один прямоугольник, что позволяет использовать точь-в-точь такой же подход. iv_an_ruНу так заранее огорчу --- там полезут вредные случаи, для которых надо будет городить как раз "память" для данных из уже пройденных координат, именно с указанием точного значения X, когда событие происходило. Или запоминать, какой именно номер прямоугольника связан с каким событием, и лазить в "двумерные" данные по ранее пройденным объектам. Пф, ну конечно надо "запоминать" ребро какого прямоугольника проходится линией; и более того -- запоминать какое это именно ребро, левое или правое, чтобы знать, включать или исключать из активного множества прямоугольник, и какой именно. А что в этом ужасного? Вас пугает дополнительная память на индекс прямоугольника и флаг левое/правое в структуре события? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 15:17 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Детишки кромсают общий случай сабжевой задачи одной левой: http://www.spoj.pl/problems/DECORATE/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:05 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
junior idiotПереход от исходных прямоугольников и впихиваемого прямоугольника к новым "обрамлённым" прямоугольникам и впихиваемой точки -- очевиден настолько, что на фоне общего алгоритма совершенно не требует внимания Всё, вопрос снят. Раз это сделано, то дальше вопроов нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:06 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Хм.... дело ясное что дело темное. Получить матрицу дело не сложное, впрочем чем то напоминает тему, когда в виде нажимаем кнопу ( ярлык на рабочий стол" винда же находит первое свободное место и кидает туда ярлык.. p.s. размеры всех мелких прямоугольников одинаковые... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 03:08 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
(изучил первые 5 ответов... как грится, однако "мдя...") VolochkovaХм.... дело ясное что дело темное. ... Чё, никак? Вот смотри: вначале у нас была одна большая нычка. Бросаем на нее первую паркетину. И она рубит главную нычку на 4 (в общем случае) меньших нычки. Ведем список/массив нычек. Итак, сейчас у нас в массиве уже 4 нычки, а первая забыта/погибла. Бросаем вторую паркетину. И идем с этой паркетиной по текущему массиву нычек. Эта паркетина какие-то нычки из массива нычек ваще не затронет -- эти нычки оставляем в массиве -- а какие-то порубит. Порубленные нычки забываем, а вместо них записываем в массив их осколки-поднычки. Нычки множатся как кролики... После 5-го шага у нас будет массив всех возможных нычек. Идем по этому массиву нычек и смотрим: есть ли в нем нычка, в которую можно целиком поместить 6-ю паркетину? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 08:23 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
rt123(изучил первые 5 ответов... как грится, однако "мдя...") VolochkovaХм.... дело ясное что дело темное. ... Чё, никак? Вот смотри: вначале у нас была одна большая нычка. Бросаем на нее первую паркетину. И она рубит главную нычку на 4 (в общем случае) меньших нычки. Ведем список/массив нычек. Итак, сейчас у нас в массиве уже 4 нычки, а первая забыта/погибла. Бросаем вторую паркетину. И идем с этой паркетиной по текущему массиву нычек. Эта паркетина какие-то нычки из массива нычек ваще не затронет -- эти нычки оставляем в массиве -- а какие-то порубит. Порубленные нычки забываем, а вместо них записываем в массив их осколки-поднычки. Нычки множатся как кролики... После 5-го шага у нас будет массив всех возможных нычек. Идем по этому массиву нычек и смотрим: есть ли в нем нычка, в которую можно целиком поместить 6-ю паркетину? Вот это и напрягает. После 10 нычки из будет уже много... устану делить и выделять.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 09:22 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
rt123, решение O(N^2) было предложено почти сразу, тут больше интересно решить за O(N*logN). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 09:30 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
> После 10 нычки из будет уже много... устану делить и выделять.. Я понял буквально, что будет только 5 штук ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 10:16 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
rt123> После 10 нычки из будет уже много... устану делить и выделять.. Я понял буквально, что будет только 5 штук5 штук было условно в первом посте и интереса не представляют (любой алгоритм отработает мгновенно, кроме случайного при условии совсем плотного размещения). Обсуждается N. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 10:20 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Давайте в терминах задачи на моей ссылке. Есть стена W*H. На ней висят N картин разных размеров wi*hi Надо попытаться найти место для (N+1)-й картины, размером A*B. Вращать картину на 90гр. нельзя. Я бы делал так (позже попробую накодить): 1. Сортирую все картины по X. 2. В цикле по всем картинам, для текущей картины i иду по картинам, висящим правее ее, пока не встречу первую картину j с Х ее левой стороны такую, что X_left[j] - X_right[i] >= A т.е. по Х повесить новую картину можно. 3. Теперь осталось проверить: можно ли повесить новую картину (А*В) по Y ? Скажем, мы проверяем картины №5 и №11. Сортируем картины №№6,7,8,9,10 по Y. И смотрим: влазит ли новая картина по Y своей высотой В среди этих 5 промежуточных картин? (есно, это элементарный одномерный случай) Если влазит - место для новой картины найдено. Full Stop. Если нет: бросаем картину №5 и идем дальше по нашему циклу и проверяем картину №6 и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 12:28 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Я отстал от обуждения. А разве картины - это удачная аналогия к постановке? Ведь картины обычно вешают без "перекрытий". А у ТС была возможность кидать прямоугольники внахлёст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 12:37 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
> А у ТС была возможность кидать прямоугольники внахлёст. Хм... разве? Правда, я основном пейсатель :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 13:38 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
maytonА разве картины - это удачная аналогия к постановке? Ведь картины обычно вешают без "перекрытий". А у ТС была возможность кидать прямоугольники внахлёст.Это не критично. Два прямоугольника внахлест = три прямоугольника рядом. Конечно, если прямоугольники могут быть разного размера... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 13:42 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
Разница, думаю будет в статистике индекса по точкам. В режиме нахлёста мы можем получить эффект поглощения одник прямоугольников другими. Эдакая само-оптимизация. Для "картинной галлереи", наверное будет по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 14:38 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
VolochkovaПрямоугольники строго идут параллельно осям координат. Никаких там под углом и т.д. Блин, неужели так все сложно... Размеры прямоугольников всегда одинаковые. Допустимо касание прямоугольников. хоть в цикле идти со смещением и перебором искать область. не, mayton, нахлесты, видимо, все-таки запрещены ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2010, 18:14 |
|
||
|
Поиск свободной нычки.
|
|||
|---|---|---|---|
|
#18+
rt123Давайте в терминах задачи на моей ссылке. Есть стена W*H. На ней висят N картин разных размеров wi*hi Надо попытаться найти место для (N+1)-й картины, размером A*B. Вращать картину на 90гр. нельзя. Я бы делал так (позже попробую накодить): 1. Сортирую все картины по X. 2. В цикле по всем картинам, для текущей картины i иду по картинам, висящим правее ее, пока не встречу первую картину j с Х ее левой стороны такую, что X_left[j] - X_right[i] >= A т.е. по Х повесить новую картину можно. 3. Теперь осталось проверить: можно ли повесить новую картину (А*В) по Y ? Скажем, мы проверяем картины №5 и №11. Сортируем картины №№6,7,8,9,10 по Y. И смотрим: влазит ли новая картина по Y своей высотой В среди этих 5 промежуточных картин? (есно, это элементарный одномерный случай) Если влазит - место для новой картины найдено. Full Stop. Если нет: бросаем картину №5 и идем дальше по нашему циклу и проверяем картину №6 и т.д. (N+1)-ая тех же размеров - wi*hi. Теоретически могут и в нахлест, но пока берем что они только касаются. И перекрытий нельзя. У меня есть пока только одна идея.. стену делим на сектора (wi*hi) и смотрим входит ли в этот сектор другая "картина"? Если нет то кидаем картину иначе к следующему сектору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2010, 02:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1343393]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
206ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 533ms |

| 0 / 0 |
