Estoy trabajando en esto en este momento ... Comenzando desde un borde, estoy caminando al azar a través de una matriz cuadrada, marcando las celdas con la longitud del camino a medida que las paso.
Cuando te quedas atascado (y lo harás), crea una unión en T formando un bucle con la ruta más reciente que está junto a ti (pero mira abajo). Luego retrocedí a lo largo del camino existente hacia el otro lado del cruce en T y rompí el ciclo allí. Esta cola que cuelga luego forma su nueva "cabeza" de la caminata aleatoria (recuerde recalcular las longitudes de su ruta desde la fuente de ruta), y puede continuar.
Los experimentos demuestran que al hacer esto no entra (o no ha visto aún) a un ciclo de creación de nuevas colas, siempre y cuando su nueva "cola" quede atrapada, no solo sin cuidado, vuelva a formar un enlace con la celda de la que acaba de deshacerse si es la más reciente; elija la segunda más reciente en ese caso.
La caja de terminación es cuando te "atascas" en un elemento de borde, y has llenado la matriz (tu longitud de ruta es la misma que el área de la matriz) - listo. Tu punto de partida te lleva a tu punto final.
Parece que hay dos posibles ineficiencias y posibles inconvenientes con esto (estoy jugando con el algoritmo en este momento) - A veces te metes en una esquina y la ÚNICA manera de continuar es volver a formar el ciclo vincula con el que acabas de romper. Luego, la secuencia rastrea a través de todos los bucles que ha realizado anteriormente hasta el punto en que originalmente se quedó atascado. Si que no puede ir a ningún otro lado (es otra esquina), entonces simplemente saltará entre los dos. Hay formas de evitarlo, pero significa mantener una especie de lista de celdas en bucle, solo despejándola cuando realmente estableces una nueva ruta.
La otra es que parece propenso a dejar un cuadrado impar sin llenar, particularmente cuando su matriz es impar por impar. No he investigado completamente por qué este es el caso, y es cuando ocurre esto que el problema de la esquina previa parece ser particularmente frecuente.El trabajo continúa ...
¿Hay alguna restricción, por ejemplo no hay cuadrados negros de 2x2? –
@Lie Ryan: No. Aunque sería bueno tener tales algoritmos entre las respuestas. – Fejuto
Relacionados: http://stackoverflow.com/questions/2641964/algorithm-to-generate-a-segment-maze – nico