Damaged pixels

Albert Davletov
UniLecs
Published in
2 min readOct 28, 2021

Задача: Находим блок поврежденных пикселей. Вам дана матрица пикселей, где ‘0’ представляет рабочий пиксель, а ‘1’ представляет поврежденный пиксель.

  • Поврежденные пиксели связаны (т.е. есть только одна поврежденная область на матрице). Пиксели соединены по горизонтали и вертикали.
  • Также вам даны два целых числа x и y, которые представляют расположение одного из поврежденных пикселей.

Необходимо найти площадь наименьшего (выровненного по оси) прямоугольника, охватывающего все поврежденные пиксели.

Входные данные: Стороны матрицы имеют размер от 1 до 100 пикселей включительно. Элементы матрицы символы ‘0’, ‘1’.

Вывод: площадь наименьшего прямоугольника, охватывающего все поврежденные пиксели.

Пример:

matrix = [

[‘0’,’0',’1',’0'],

[‘0’,’1',’1',’0'],

[‘0’,’1',’0',’0']

].

x = 0, y = 2

Output: 6

Разбор

Классический подход в подобных задачах — использование поиска в глубину (Depth-first search, DFS).

То есть из каждой текущего пикселя матрицы мы запускаем поиск вглубь матрицы до тех пор, пока встречаются поврежденные пиксели. И для каждой из сторон мы сохраним крайние координаты поврежденных пикселей. Таким образом, мы сможем определить длину поврежденной области по оси X и оси Y, и найдем площадь поврежденной области.

Детали реализации:

  • Eсли исходная задача позволяет изменять исходные данные, в нашем случае, это матрица, то для того, чтобы алгоритм не считал уже пройденные элементы, мы можем изменить значение поврежденного пикселя.
  • Если вы не хотите изменять исходные данные, то обычно используется вспомогательный массив посещенных координат visited. Таким образом на каждом шаге поиска в глубину, вы пропускаете уже пройденные элементы.

В нашем случае, мы можем изменить исходные данные, поэтому для простоты воспользуемся 1м вариантом.

Реализация

C#

Play-test

https://dotnetfiddle.net/sRMdAC

--

--