Разбиение битовой карты

From
Max Alekseyev (2:5015/60)
To
Sergei Makarov
Date
2002-07-31T18:31:56Z
Area
RU.ALGORITHMS
████ OS/2        Hi, Sergei !

Replying to a message of Sergei Makarov to All:

 SM> Посоветуйте алгоритм решения задачи:
 SM> Дана битовая карта (0|1) N x M.
 SM> Надо выделить из нее список прямоугольников единиц (структура RECT).
 SM> Критерии оптимальности:     минимум прямоугольников

Первое, что пришло в голову:

1) Находишь еще непокрытую "угловую" (см. ниже) единицу, определяешь прямоугольник 1x1 из нее состоящий. Если такой единицы нет - конец.

2) Раздуваешь прямоугольник, пока возможно: если снаружи вдоль какой-то стороны стоят одни единицы, добавляешь их к прямоугольнику.

3) Добавляешь прямоугольник в список. Помечаешь все единицы, которые он содержит, как покрытые.

4) goto 1

ЗЫ. "Угловая" единица - это единица не зажатая двумя другими непокрытыми единицами (по вертикали или горизонтали). Возможные варианты с точностью до поворотов:

    [*]            [*]         [*]
 [*](1)[*]      [*](1)[1]   [*](1)[1]
    [*]            [*]         [1]

здесь: (1) - угловая единица
       [1] - непокрытая единица
       [*] - ноль, покрытая единица или отсутствие клетки

Regards,      °°
        Max    ~

--- FleetStreet 1.27.3.8
 * Origin:  (2:5015/60)