найти все прямоугольные области с определенными свойствами в матрице

дана матрица n*m с возможными значениями 1, 2 и null:

  . . . . . 1 . .
  . 1 . . . . . 1
  . . . 2 . . . .
  . . . . 2 . . .
  1 . . . . . 1 .
  . . . . . . . .
  . . 1 . . 2 . .
  2 . . . . . . 1

Я ищу все блоки B (содержащие все значения между (x0,y0) и (x1,y1) ) что:

  • содержит хотя бы одну «1»
  • не содержит «2»
  • не является подмножеством другого блока с указанными выше свойствами

Пример:

blocks

Красный, зеленый и синий все области содержат «1», нет «2» и не являются частью большей области. Таких блоков на этой картинке, конечно же, более 3-х. Я хочу найти все эти блоки.

Как быстро найти все эти области?

У меня есть работающее решение грубой силы, перебирающее все возможные прямоугольники и проверяющее, удовлетворяют ли они первым двум критериям; затем перебираем все найденные прямоугольники, удаляя все прямоугольники, содержащиеся в другом прямоугольнике; и я могу ускорить это, сначала удалив последовательные одинаковые строки и столбцы. Но я совершенно уверен, что есть гораздо более быстрый способ.

7
задан Saeed Amiri 12 June 2012 в 18:23
поделиться