дана матрица n*m с возможными значениями 1, 2 и null:
. . . . . 1 . .
. 1 . . . . . 1
. . . 2 . . . .
. . . . 2 . . .
1 . . . . . 1 .
. . . . . . . .
. . 1 . . 2 . .
2 . . . . . . 1
Я ищу все блоки B (содержащие все значения между (x0,y0) и (x1,y1) ) что:
Пример:
Красный, зеленый и синий все области содержат «1», нет «2» и не являются частью большей области. Таких блоков на этой картинке, конечно же, более 3-х. Я хочу найти все эти блоки.
Как быстро найти все эти области?
У меня есть работающее решение грубой силы, перебирающее все возможные прямоугольники и проверяющее, удовлетворяют ли они первым двум критериям; затем перебираем все найденные прямоугольники, удаляя все прямоугольники, содержащиеся в другом прямоугольнике; и я могу ускорить это, сначала удалив последовательные одинаковые строки и столбцы. Но я совершенно уверен, что есть гораздо более быстрый способ.