-
-
Save 247369/95c0d7b96a5263a531daad863725ce3a 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
"""
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.
"""
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
print(laberinto(7, 13))