2010-10-26 13 views
10

Considere un mapa de bits MxN donde las celdas son 0 o 1. '1' significa llenado y '0' significa vacío.Cuente el número de "agujeros" en un mapa de bits

Encuentra el número de 'agujeros' en el mapa de bits, donde un agujero es una región contigua de celdas vacías.

Por ejemplo, esto tiene dos agujeros:

11111 
10101 
10101 
11111 

... y esto tiene una sola:

11111 
10001 
10101 
11111 

¿Cuál es la manera más rápida, cuando M y N son a la vez entre 1 y 8?

Aclaración: diagonales no se consideran contiguas, sólo importa lado de adyacencia.

Nota: Estoy buscando algo que toma ventaja del formato de datos. Sé cómo transformar esto en un gráfico y [BD] FS, pero eso parece excesivo.

+0

¿Por qué huele a tarea o golf de código? @Florin, gracias por la actualización. Por favor, considere esta observación "rescindida". Tomaremos tu palabra. – jcolebrand

+0

¡SABE como la tarea! – Luiscencio

+1

No es tarea, pero no importa. Estoy tratando de resolver un problema mayor y esto es solo un subproblema. – florin

Respuesta

17

Necesita hacer connected component labeling en su imagen. Puede usar el Two-pass algorithm descrito en el artículo de Wikipedia que he vinculado anteriormente. Dado el pequeño tamaño de su problema, el One-pass algorithm puede ser suficiente.

También podría usar BFS/DFS pero yo recomendaría los algoritmos anteriores.

+1

Sí, el etiquetado de componentes conectados debería ser el truco. Además, felicitaciones a 10k, @Jacob (o casi, supongo que pulsaste rep-cap para hoy). – Jonas

+0

@Jonas: ¡Lo sé! Esperemos que Florin acepte esta respuesta hoy :) – Jacob

+0

@Jonas: Puedo reconocer las felicitaciones ahora: D – Jacob

5

Esto parece un buen uso de la estructura de datos disjuntos.
convertir el mapa de bits en una matriz 2D
bucle a través de cada elemento
si el elemento actual es un 0, fusionarlo con el conjunto de uno de sus vecinos vacíos "anteriores (ya visitados)
si no tiene vecinos vacíos , añadirlo a su propio conjunto

luego simplemente contar el número de conjuntos

+0

~ eso es exactamente lo que @Jacob ya ha vinculado. – jcolebrand

+0

Escribí esta respuesta antes de mirar su. –

0

puede haber ventajas que se obtienen mediante el uso de búsquedas en tablas y operaciones bit a bit.

Por ejemplo, puede buscarse una línea completa de 8 píxeles en la tabla de 256 elementos, por lo que el número de agujeros en un campo 1xN se obtiene mediante búsqueda simple. Entonces puede haber alguna tabla de búsqueda de elementos 256xK, donde K es el número de configuraciones de agujeros en la línea anterior, contando el número de agujeros completos y la configuración del próximo agujero. Esa es solo una idea.

+0

Acabo de empezar a construir mi tabla de búsqueda 2^64, pero me quedé sin el presupuesto del año para RAM 8 ^) – florin

+0

florin: ¡utilice la informática distribuida! =) – Vovanium

+0

Encontré este rompecabezas muy interesante y pasé un poco de tiempo libre para hacer un boceto del algoritmo 'línea por línea' con búsquedas y operaciones bit a bit, utilizando solo 560 bytes de tablas (para patrones de 8 bits de ancho). Aquí está el código: http://dl.dropbox.com/u/13343791/holecount2.c Lo siento si el código no está bien documentado. – Vovanium

Cuestiones relacionadas