考虑一个MxN位图,其中单元格为0或1.“1”表示填充,“0”表示空。
找到位图中“洞”的数量,其中一个洞是空单元的连续区域。
例如,这有两个漏洞:
11111
10101
10101
11111
......这只有一个:
11111
10001
10101
11111
当M和N都介于1和8之间时,最快的方法是什么?
澄清:对角线不被认为是连续的,只有侧面邻接很重要。
注意:我正在寻找利用数据格式的东西。我知道如何将其转换为图形和[BD] FS,但这似乎有点过分了。
答案 0 :(得分:20)
您需要在图片上执行connected component labeling。您可以使用我上面链接的维基百科文章中描述的Two-pass algorithm。鉴于问题的规模很小,One-pass algorithm可能就足够了。
答案 1 :(得分:5)
这似乎很好地利用了不相交的数据结构
将位图转换为2d阵列
循环遍历每个元素
如果当前元素为0,则将其与其“先前”空邻居(已访问过的)的一组合并
如果它没有空的邻居,请将其添加到自己的集合
然后只计算套数
答案 2 :(得分:0)
使用表查找和按位操作可能会带来好处。
例如,可以在256个元素表中查找8个像素的整行,因此通过单个查找获得字段1xN中的孔数。然后可能有一些256xK元素的查找表,其中K是前一行中的孔配置数,包括完整孔的数量和下一个孔配置。这只是一个想法。