Прежде всего, координаты могут быть переведены / спроецированы таким образом, чтобы размер прямоугольника был 1x1, а ориентация - 0 ° (выровнена по оси X / Y).Поэтому я буду предполагать эту ситуацию.
Тогда вы могли бы действовать следующим образом:
- Сортировать точки по их x -координате
- Создатьориентированный граф следующим образом:
- Для каждой точки a взять точки в интервале x [a x ,a x + 1] , за исключением самого a
- Исключить из этого списка те точки, чья координата y не входит вдиапазон [a y -1, a y + 1]
- Сортировать эти точки по y -координировать
- Поместите эти точки в список смежности для точки a .
- Пометить все точки как непосещенные
- Если не было посещенийточки, верните 0, чтобы указать, что (больше) прямоугольники не нужны.
- Возьмите следующую непосещенную точку a из отсортированного списка точек: отметьте a как посещенные.
- Если у a нет соседей, то увеличьте прямоугольниксосчитайте и повторите с шага 4
- Переместите прямоугольник с его левой x -координатой, всегда равной x , по соседям, так что:
- первый выбранный прямоугольник имеет свою низкую y -координату, общую с первой не посещенной соседней точкой
- поддерживает список L соседей, которые посещаются (толькоесли они еще не были помечены как посещенные) путем охвата этим прямоугольником
- все последующие позиции прямоугольника получают по одной непосещаемой точке на их высоком - y -координированном конце.
- Точки в L , которые обнаруживаются на нижней стороне скользящего прямоугольника * y , удаляются из L и снова помечаются как непосещенные
- Каждый раз, когда определяется новая позиция прямоугольника, выполняется рекурсивный вызов (DFS), который начинается на шаге 4.
- Вызов DFS возвращает количество прямоугольников, которые все еще были необходимы для покрытия всех оставшихся, не посещенныхОчки
- Держитеминимальное значение, возвращаемое всеми этими рекурсивными вызовами, и добавление 1 (для текущего прямоугольника)
- Примечание: дерево рекурсии можно удалить, передав текущий минимальный результат в качестве точки отсечения, чтобы избежать поиска, который увеличиваетсяслишком большое количество прямоугольников.
- Когда все позиции прямоугольников были обработаны, отметьте все точки в L как не посещенные.
- Вернитенайдено минимальное количество прямоугольников.
Этот алгоритм все еще может быть очень дорогим, поскольку дерево поиска может легко стать очень широким.
Потенциальным улучшением могло бы стать использование вместо этого BFS.DFS, используя приоритетную очередь (например, Min Heap).Число, которое нужно минимизировать, - это количество уже использованных прямоугольников (т.е. стоимость до настоящего времени) плюс разность по оси X между самой правой (не посещенной) точкой и самой левой не посещенной точкой, округленной в большую сторону (т.е. нижней границей стоимостивсе еще впереди).Это алгоритм A *, поэтому вы можете остановить поиск, как только возникнет ситуация, когда все точки были охвачены (посещены).
Недостатком этого метода BFS является использование памяти и управление ею, поскольку каждое состояние (в очереди приоритетов) включает в себя набор посещенных точек.