Created
October 31, 2017 17:58
-
-
Save knkillname/60779628155ef113be3f6537c1c75b19 to your computer and use it in GitHub Desktop.
Laberinto por recorrido en profundidad en Python 3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Crear un laberinto aleatorio en Python3 usando el algoritmo de | |
# recorrido en profundidad. El propósito de este programa es mostrar las | |
# características del lenguaje. | |
# | |
# Autor: Mario Abarca | |
# Fecha: 2017/09/07 | |
from random import shuffle, randint # Números pseudoaleatorios | |
from itertools import product # Producto cartesiano | |
def laberinto(m, n): | |
def vecinos(i, j): # Conjunto de celdas aledañas a (i, j) | |
if 0 < i: yield i - 1, j | |
if i < m - 1: yield i + 1, j | |
if 0 < j: yield i, j - 1 | |
if j < n - 1: yield i, j + 1 | |
def visitar(i, j): # Alg. de recorrido en profundidad: | |
X.add((i, j)) # Marcar celda actual como visitada | |
N = list(vecinos(i, j)); shuffle(N) # Desordenar celdas vecinas | |
for h, k in N: # Para cada celda vecina | |
if (h, k) in X: continue # ...que no haya sido visitada: | |
A[i + h + 1][j + k + 1] = ' ' # Tumbar el muro que las separa | |
visitar(h, k) # Visitar vecina recursivamente | |
A = [['█']*(2*n + 1) for i in range(2*m + 1)] # Tablero | |
for i, j in product(range(1, 2*m + 1, 2), range(1, 2*n + 1, 2)): | |
A[i][j] = ' ' # Poner celdas blancas | |
X = set() # Conjunto de celdas visitadas | |
visitar(randint(0, m - 1), randint(0, n - 1)) # Inicio en celda aleatoria | |
return('\n'.join(''.join(fila) for fila in A)) # Unir símbolos en un str | |
print(laberinto(11, 39)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
hola.. eh usado el codigo y solo genera laberintos aleatorios, muy bueno!!
yo estoy tratando que lo recorra de manera automatica basandose en el algoritmo primero en profundida y que sea recursivo por si no encuenta el camino en el primer recorrido
gracias!!