Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
75
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. recorridoDesde :: Posicion -> Camino -> [Posicion]
  40. recorridoDesde p [] = [p]
  41. recorridoDesde p (x:xs) = p : (recorridoDesde (movInstantaneo p x) xs)
  42.  
  43. recorrido :: Camino -> [Posicion]
  44. recorrido c = recorridoDesde (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 (recorrido c) = False
  51.                           | otherwise = caminoDeSalida cm c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement