можно ли избежать возврата при попытке минимизировать пространство прямоугольника, которое заключает в себе прямоугольники различных целочисленных форм?

Абстракция моей проблемы заключается в том, что на декартовой плоскости много прямоугольников. Эти прямоугольники имеют известные целочисленные размеры и должны иметь целочисленные координаты, их абсциссы (горизонтальные координаты) известны и фиксированы, могут различаться только их ординаты (вертикальные координаты).

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

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

Редактировать: Извините, теперь я понимаю, что выразился недостаточно ясно. Когда я впервые задал этот вопрос, я создавал приложение-календарь. Менеджер заполнял события для своей команды:

  • событие А начинается с 14:00. и заканчивается в 16:00.
  • событие B начинается с 17:00. и заканчивается в 18:00.
  • событие C начинается с 16:00. и заканчивается в 18:00.
  • событие D начинается с 14:00. и заканчивается в 15:00.
  • событие E начинается с 15:00. и заканчивается в 17:00.

Я хочу отображать эти события на временной шкале, и я хочу, чтобы они занимали как можно меньше места на экране, не перекрываясь (поскольку менеджер хочет видеть каждое событие в своем прямоугольнике и видеть описание в этом прямоугольнике).

Наилучшей компоновкой для приведенного выше примера будет следующая:

+-----+-----+
|  A  |  C  |
+---+-+-+---+
| D | E | B |
+---+---+---+

A и C находятся на одной линии, D, E, B — на другой. Жадный подход поместил бы A и B на одну строку, C и D на другую строку, а E на третью строку.


person Valentin Brasso    schedule 01.07.2010    source источник
comment
Неясно, какая информация у вас есть, какую информацию вы должны генерировать и какие ограничения на них наложены. Например, означают ли абсциссы оба значения X (Гц) или только ширину? И вы знаете размер прямоугольника, но не его значения Y (Vt), означает ли это, что вы знаете его площадь и должны вывести высоту, или вы знаете высоту, но должны вывести точные значения Y? И разрешено ли прямоугольникам перекрываться? Не могли бы вы привести небольшой пример, скажем, 4-6 прямоугольников), демонстрирующий тип задачи и ее решение? Спасибо.   -  person RBarryYoung    schedule 09.03.2014


Ответы (2)


Если я правильно прочитал ваш вопрос, вам нужно найти минимальный прямоугольник, который покрывает заданное множество прямоугольников — это правильно?

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

Если это так, просто отсканируйте данный набор прямоугольников на предмет их «минимального дна» и «максимального верха», и они определят искомый прямоугольник.

person CiaPan    schedule 09.03.2014

Я бы сохранил хронологический порядок событий. Вы строите календарь, поэтому хронологический порядок имеет смысл. Сначала покажите событие, которое начинается первым.

Я бы решил проблему с экраном по-другому, не переупаковывая элементы. Например, уменьшите размер элементов, но покажите всплывающую подсказку с дополнительной информацией, когда пользователь наведет указатель мыши на элемент. Когда пользователь выбирает элемент (щелчком мыши), отображается полная информация.

person Dialecticus    schedule 10.03.2014
comment
извините, но я не могу изменить это требование. Менеджер выигрывает от размещения, которое я опубликовал: он может видеть, сколько раз ему нужно разделить свою команду (или как мало людей он должен отправить), чтобы посетить все мероприятия. - person Valentin Brasso; 10.03.2014