Skip to content

Instantly share code, notes, and snippets.

@247369
Forked from knkillname/laberinto.py
Last active November 7, 2023 15:39
Show Gist options
  • Save 247369/95c0d7b96a5263a531daad863725ce3a to your computer and use it in GitHub Desktop.
Save 247369/95c0d7b96a5263a531daad863725ce3a to your computer and use it in GitHub Desktop.
Laberinto por recorrido en profundidad en Python 3
# 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))
@247369
Copy link
Author

247369 commented Nov 7, 2023

"""
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

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(7, 13))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment