У меня есть набор прямоугольников, и я хотел бы "уменьшить" набор, чтобы у меня было наименьшее количество прямоугольников для описания той же области, что и исходный набор. Если возможно, я бы хотел, чтобы он также был быстрым, но я больше заинтересован в том, чтобы получить количество прямоугольников как можно ниже. У меня есть подход, который работает большую часть времени.
В настоящее время я начинаю в самом верхнем левом прямоугольнике и вижу, могу ли я расширять его справа и вниз, сохраняя при этом прямоугольник. Я делаю это, пока он больше не может расширяться, удалите и разделим все пересекающиеся прямоугольники и добавим расширенный прямоугольник обратно в список. Затем я снова запускаю процесс со следующим верхним левым прямоугольником и так далее. Но в некоторых случаях это не работает. Например:
С этим набором из трех прямоугольников правильное решение будет состоять из двух прямоугольников, например:
Однако в этом случае мой алгоритм начинается с обработки синего прямоугольника. Это расширяется вниз и разбивает желтый прямоугольник (правильно). Но затем, когда остальная часть желтого прямоугольника обрабатывается, вместо того, чтобы расширяться вниз, он сначала расширяется и возвращает часть, которая была ранее отколота. Затем обрабатывается последний прямоугольник, и он не может расширяться вправо или вниз, поэтому исходный набор прямоугольников остается. Я мог бы подстроить алгоритм, чтобы свернуть сначала, а затем вправо. Это исправит этот случай, но это вызовет ту же проблему в подобном сценарии, который был перевернут.
Изменить:. Чтобы уточнить, исходный набор прямоугольников не перекрывается и не должен быть подключен. И если подмножество прямоугольников связано, многоугольник, который полностью покрывает их, может иметь в нем дыры.