Algoritmo de relleno

Esta historia parte de un pequeño proyecto de antaño en el que intenté implementar la herramienta de relleno de Paint o Photoshop.

Estamos hablando de un algoritmo de relleno por difusión: el objetivo es pasar por todos los puntos no coloreados partiendo de uno arbitrario y la solución se antojaba sencilla: un algoritmo de backtracking

Estuve cerca de lograrlo pero cuando la superficie a rellenar era medianamente grande, el programa se colgaba por desbordamiento de pila.

El problema es que, al tratarse de una función recursiva, con cada paso que daba había que guardar en la pila el punto anterior, y si el espacio es grande podemos estar hablando de miles o millones de pasos. Esta información se guarda en la pila de llamadas, una zona de memoria especialmente rápida... y pequeña.

La solución es muy fácil: convertir la función recursiva en iterativa, y guardar cada punto a explorar dentro de un contenedor de pila (QStack en la biblioteca Qt), cuyos datos se almacenan en el heap, mucho más grande que la pila de llamadas.

Vista del programa.
Tenemos aquí el algoritmo implementado con un programa basado en Qt para verlo funcionando, incluye el código fuente y el ejecutable para Windows x64.

Comentarios

Entradas populares de este blog

Problema de las N reinas

Cifrado de Vernam