Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. import Data.List as List
  2. import Data.Map as Map
  3. import Data.Maybe as Maybe
  4. import Data.Sequence as Seq
  5. import Data.Set as Set
  6.  
  7. maze = "#S######.#" ++
  8. "......#..#" ++
  9. ".#.##.##.#" ++
  10. ".#........" ++
  11. "##.##.####" ++
  12. "....#....#" ++
  13. ".#######.#" ++
  14. "....#....." ++
  15. ".####.####" ++
  16. "....#....G"
  17.  
  18. main = print $ fromMaybe 1000000 $ search m (Seq.fromList [(start, -1)]) Set.empty
  19. where coords = [(x,y) | x <- [1..10], y <- [1..10]]
  20. m = Map.fromList $ coords `List.zip` maze
  21. start = case List.elemIndex 'S' maze of Just i -> coords !! i
  22.  
  23. type Coord = (Int, Int)
  24.  
  25. search :: Map Coord Char -> Seq (Coord, Int) -> Set Coord -> Maybe Int
  26. search m que visited = case Seq.viewl que of (c,d) :< que' -> search' c d que'
  27. _ -> Nothing
  28. where search' c@(x,y) d q = case Map.lookup c m of Nothing -> search m q visited
  29. Just '#' -> search m q visited
  30. Just 'G' -> Just d
  31. Just _ -> if Set.member c visited
  32. then search m q visited
  33. else let d' = d + 1
  34. q' = q |> ((x+1,y), d') |> ((x-1,y), d') |> ((x,y+1), d') |> ((x,y-1), d')
  35. visited' = Set.insert c visited
  36. in search m q' visited'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement