Упрощенный, мне нужно решить следующую проблему:
У вас есть двумерный массив, заполненный 0s и 1s. Найдите минимальное количество прямоугольников, чтобы они покрывали все 1s. Прямоугольники не должны перекрываться.
Подпись функции может выглядеть так:
List<Rectangle> FindCoveringRectangles(bool[,] array)
У меня уже есть решение, которое "достаточно хорошо", но не всегда находит минимальное количество прямоугольников. Я хотел бы знать, есть ли какой-нибудь известный и эффективный алгоритм, который может быть применен для решения этой проблемы?
Пример:
Входной массив:
..........
.1.....11.
.......11.
...111....
...111....
...111....
....1111..
....1111..
......11..
..........
(0s заменены точками для удобочитаемости)
Возможно, вы получите следующие прямоугольники:
(2,2,2,2),
(2,8,3,9),
(4,4,6,6),
(7,5,8,8),
(9,7,9,8)
(верхний, левый, нижний, правый), 1-основанный
Может быть несколько решений, но одного достаточно.