Encontrar los vecinos de una celda en una cuadrícula.
Digamos que tengo una cuadrícula bidimensional de 10×10 celdas. La celda superior izquierda tiene coordenadas (0,0) y la celda inferior derecha tiene coordenadas (9,9).
El código debajo no parece funcionar de la manera que quiero. No puedo entender qué estoy haciendo mal.
X = 10
Y = 10
class Celda:
def __init__(self,x,y) -> None:
self.coordenadas = (x,y)
self.vecinos = self.encontrar_vecinos()
def encontrar_vecinos(self):
x,y = self.coordenadas
vecinos = [
(x+1,y),(x-1,y),(x,y+1),(x,y-1),(x+1,y+1),
(x+1,y-1),(x-1,y+1),(x-1,y-1)
]
for vecino in vecinos:
if vecino[0] < 0 or vecino[1] < 0:
vecinos.remove(vecino)
elif vecino[0] >= X or vecino[1] >= Y:
vecinos.remove(vecino)
return vecinos
celda1 = Celda(0,0)
celda1.vecinos
# [(1, 0), (0, 1), (1, 1), (-1, 1)]
# No debería tener (-1,1)
celda2 = Celda(9,9)
celda2.vecinos
# [(8, 9), (9, 8), (10, 8), (8, 8)]
# No debería tener (10,8)
davy.ai
Solución:
El problema principal con el código es que trata de eliminar elementos de una lista mientras itera sobre ella.
Esto no se recomienda ya que puede llevar a resultados impredecibles al alterar los índices de los elementos, lo que puede afectar la iteración del bucle.
Para solucionar esto, podemos utilizar comprensión de listas para crear una nueva lista que contenga solo vecinos válidos.
Esto creará una nueva lista que solo contiene vecinos con coordenadas válidas.
Aquí está el código actualizado:
Ahora el código debería funcionar como se espera y no debería tener vecinos inválidos.