Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- Dada una posición y un desplazamiento , devuevle una nueva posición
  2. movInstantaneo :: Posicion -> Desplazamiento -> Posicion
  3. movInstantaneo (x,y) Arriba = (x-1 , y)
  4. movInstantaneo (x,y) Abajo = (x+1 , y)
  5. movInstantaneo (x,y) Derecha = (x , y+1)
  6. movInstantaneo (x,y) Izquierda = (x , y-1)
  7.  
  8.  
  9. -- Determina si un camino se mantiene dentro de los limites del tablero a lo largo de su trayectoria, asumiendo que comenzara por la posicion (1,1)
  10. caminoValidodesde :: Tablero a -> Camino -> Posicion -> Bool
  11. caminoValidodesde _ [] _ = True
  12. caminoValidodesde t (x:xs) p | posValida t (movInstantaneo p x) = caminoValidodesde t xs (movInstantaneo p x)
  13.                              | otherwise = False
  14.  
  15. caminoValido :: Tablero a -> Camino -> Bool
  16. caminoValido t c = caminoValidodesde t c (1,1)
  17.  
  18. -- Asumiendo que tenemos un camino valido, determina si comenzando en (1,1), al seguir el camino dado, llega a la pos (n,n) sin pisar ninguna mina
  19. -- Notemos que si llegamos al (n,n) pero todavía hay mas para recorrer, el programa no termina aún.
  20. caminoDesalidaDesde :: CampoMinado -> Camino -> Posicion -> Bool
  21. caminoDesalidaDesde cm [] (a, b) | a == tamano cm && b == tamano cm = True
  22.                                  | otherwise = False
  23. caminoDesalidaDesde cm (x:xs) p | valor (cm) p = False
  24.                                 | otherwise = caminoDesalidaDesde cm xs (movInstantaneo p x)
  25.  
  26. -- Verifico que el Camino sea valido
  27. -- Corremos el caminodesalidaDesde el (1,1)
  28. caminoDeSalida :: CampoMinado -> Camino -> Bool
  29. caminoDeSalida cm c | not (caminoValido cm c) = False
  30.                     | otherwise = caminoDesalidaDesde cm c (1,1)
  31.  
  32. -- Dada una lista de Posiciones devuelve True si hay dos Posiciones repetidas
  33. hayRepetidos :: [Posicion] -> Bool
  34. hayRepetidos [] = False
  35. hayRepetidos (x:xs) | elem x xs = True
  36.                     | otherwise = hayRepetidos xs
  37.  
  38. -- Dado un Camino devuelve una lista de las Posiciones que recorre
  39. convertirDesde :: Posicion -> Camino -> [Posicion]
  40. convertirDesde p [] = [p]
  41. convertirDesde p (x:xs) = p : (convertirDesde (movInstantaneo p x) xs)
  42.  
  43. convertir :: Camino -> [Posicion]
  44. convertir c = convertirDesde (1,1) c
  45.  
  46. --Determina si un RAE, comenzando en la posición (1, 1), al seguir el camino dado, llega a la posición
  47. --(n, n) sin pisar ninguna mina y sin pasar dos veces por una misma posición.
  48.  
  49. caminoDeSalidaSinRep :: CampoMinado -> Camino -> Bool
  50. caminoDeSalidaSinRep cm c | hayRepetidos (convertir c) = False
  51.                           | otherwise = caminoDeSalida cm c
  52.  
  53. recorrido :: TableroAF -> Posicion -> [Posicion]
  54. recorrido t p | not (posValida t p) = []
  55.               | otherwise = p : recorrido t (movInstantaneo p (valor t p))
  56.  
  57. -- Dado un tablero y una posicion p, determina si al colocar un AF en p, el AF escapará del tablero o entrará en un loop infinito
  58. escapaDelTableroaux :: TableroAF -> Posicion -> [Posicion] -> Bool
  59. escapaDelTableroaux t p l | not (posValida t p) = True
  60.                           | hayRepetidos l = False
  61.                           | otherwise = escapaDelTableroaux t (movInstantaneo p (valor t p)) (p:l)
  62.  
  63. escapaDelTablero :: TableroAF -> Posicion -> Bool
  64. escapaDelTablero t p = escapaDelTableroaux t p []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement