Как правило, вы решаете подобные проблемы, используя так называемые алгоритмы сканирования линии .Они проверяют данные по одной строке (или строка сканирования ) за раз, выстраивая ответ, который вы ищете, в ваших возможных прямоугольниках.
Вот примерный план того, как это будет работать.
Пронумеруйте все строки в вашем изображении от 0..6, я буду работать снизу вверх.
Изучая строку 0, вы начинаете с двух прямоугольников (я предполагаю, что вас интересует только черный квадрат).Я буду ссылаться на прямоугольники, используя (x, y, width, height).Два активных прямоугольника: (1,0,2,1) и (4,0,6,1).Вы добавляете их в список активных прямоугольников.Этот список отсортирован по возрастанию координаты х.
Теперь вы закончили со строкой сканирования 0, так что вы увеличиваете свою строку сканирования.
Изучая строку 1, вы работаете вдоль строки, проверяя, есть ли у вас что-либо из следующего:
- новые активные прямоугольники
- пространство для роста существующих прямоугольников
- препятствия, которые разделяют существующие прямоугольники
- препятствия, требующие удаления прямоугольника из активного списка
По мере продвижения по строке вы увидите, что у вас есть новый активный прямоугольник (0,1,8,1), мы можем увеличить один из существующих активных прямоугольников до (1,0,2,2)) и нам нужно удалить активный (4,0,6,1), заменив его двумя более узкими.Нам нужно запомнить это.Это самое большое, что мы видели до сих пор.Он заменен двумя новыми активными: (4,0,4,2) и (9,0,1,2)
Итак, при отправке строки сканирования 1 мы имеем:
- Активный список: (0,1,8,1), (1,0,2,2), (4,0,4,2), (9, 0, 1, 2)
- Наибольшее на данный момент: (4,0,6,1)
Вы продолжаете в том же духе, пока у вас не закончатся линии сканирования.
Сложная часть кодируетподпрограмма, выполняемая вдоль линии сканирования, обновляющая активный список.Если вы сделаете это правильно, вы будете рассматривать каждый пиксель только один раз.
Надеюсь, это поможет.Это немного сложно описать.