es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , ,

Answer

  1. Avatar for 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.

    neighbors = [
              (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)
            ]
    
    neighbors = [n for n in neighbors if 0 <= n[0] < X and 0 <= n[1] < Y]
    

    Esto creará una nueva lista que solo contiene vecinos con coordenadas válidas.

    Aquí está el código actualizado:

    X = 10
    Y = 10
    
    class Cell:
        def __init__(self,x,y) -> None:
            self.coordinates = (x,y)
            self.neigbors = self.find_neighbors()
    
        def find_neighbors(self):
            x,y = self.coordinates
    
            neighbors = [
              (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)
            ]
    
            neighbors = [n for n in neighbors if 0 <= n[0] < X and 0 <= n[1] < Y]
    
            return neighbors
    
    cell1 = Cell(0,0)
    print(cell1.neigbors) # [(1, 0), (0, 1), (1, 1)]
    
    cell2 = Cell(9,9)
    print(cell2.neigbors) # [(8, 9), (9, 8), (8, 8)]
    

    Ahora el código debería funcionar como se espera y no debería tener vecinos inválidos.

Comments are closed.