Подсчитайте количество "дырок" в растровом изображении
рассмотрим растровое изображение MxN, где ячейки равны 0 или 1. "1" означает заполненный, а " 0 " означает пустой.
найдите количество "отверстий" в растровом изображении, где отверстие является смежной областью пустых ячеек.
например, это имеет два отверстия:
11111
10101
10101
11111
... и это имеет только одно:
11111
10001
10101
11111
каков самый быстрый способ, когда M и N находятся между 1 и 8?
уточнение: диагонали не считаются смежное, только боковое соседство имеет значение.
Примечание: я ищу что-то, что использует формат данных. Я знаю, как преобразовать это в график и [BD]FS, но это кажется излишним.
3 ответов
вам нужно маркировка подключенного компонента на ваше изображение. Вы можете использовать двухпроходный алгоритм описано в статье Википедии, которую я прикрепил выше. Учитывая небольшой размер вашей проблемы,алгоритм одного прохода может быть достаточно.
вы также можете использовать BFS/DFS но я бы рекомендовал вышеуказанные алгоритмы.
Это похоже на хорошее использование структуры данных непересекающихся наборов.
Преобразование растрового изображения в 2d массив
цикл через каждый элемент
если текущий элемент равен 0, объедините его с набором его "предыдущих" пустых соседей (уже посещенных)
если у него нет пустых соседей, добавьте его в свой собственный набор
тогда просто посчитайте количество наборов
могут быть преимущества, полученные с помощью поиска таблиц и побитовых операций.
например, вся строка из 8 пикселей может быть просмотрена в таблице 256 элементов, поэтому количество отверстий в поле 1xN получается одним поиском. Затем может быть некоторая таблица поиска элементов 256xK, где K-количество конфигураций отверстий в предыдущей строке, число полных отверстий и следующая конфигурация отверстий. Это просто идея.