Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Data.List as List
- import Data.Map as Map
- import Data.Maybe as Maybe
- import Data.Sequence as Seq
- import Data.Set as Set
- maze = "#S######.#" ++
- "......#..#" ++
- ".#.##.##.#" ++
- ".#........" ++
- "##.##.####" ++
- "....#....#" ++
- ".#######.#" ++
- "....#....." ++
- ".####.####" ++
- "....#....G"
- main = print $ fromMaybe 1000000 $ search m (Seq.fromList [(start, -1)]) Set.empty
- where coords = [(x,y) | x <- [1..10], y <- [1..10]]
- m = Map.fromList $ coords `List.zip` maze
- start = case List.elemIndex 'S' maze of Just i -> coords !! i
- type Coord = (Int, Int)
- search :: Map Coord Char -> Seq (Coord, Int) -> Set Coord -> Maybe Int
- search m que visited = case Seq.viewl que of (c,d) :< que' -> search' c d que'
- _ -> Nothing
- where search' c@(x,y) d q = case Map.lookup c m of Nothing -> search m q visited
- Just '#' -> search m q visited
- Just 'G' -> Just d
- Just _ -> if Set.member c visited
- then search m q visited
- else let d' = d + 1
- q' = q |> ((x+1,y), d') |> ((x-1,y), d') |> ((x,y+1), d') |> ((x,y-1), d')
- visited' = Set.insert c visited
- in search m q' visited'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement