Improve Day 18, Puzzle 1 solution
This commit is contained in:
parent
aa89f22040
commit
0176c6b5df
@ -4,7 +4,7 @@ import Data.Array (Array, indices, listArray, (!), (//))
|
|||||||
import Data.Function (on)
|
import Data.Function (on)
|
||||||
import Data.List (minimumBy)
|
import Data.List (minimumBy)
|
||||||
import Data.List.Split (splitOn)
|
import Data.List.Split (splitOn)
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map.Strict as M
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
|
|
||||||
type Coords = (Int, Int)
|
type Coords = (Int, Int)
|
||||||
@ -48,11 +48,10 @@ initDijkstraState start g =
|
|||||||
}
|
}
|
||||||
in s {distances = M.adjust (const (Dist 0)) start (distances s)}
|
in s {distances = M.adjust (const (Dist 0)) start (distances s)}
|
||||||
|
|
||||||
updateDistances :: Graph -> M.Map Coords (Distance Int) -> Coords -> M.Map Coords (Distance Int)
|
updateDistances :: Graph -> M.Map Coords (Distance Int) -> [Coords] -> Distance Int -> M.Map Coords (Distance Int)
|
||||||
updateDistances graph dists coords =
|
updateDistances _ dists [] _ = dists
|
||||||
let nodes = edges graph M.! coords
|
updateDistances graph dists (n:nodes) startD =
|
||||||
dist = dists M.! coords
|
updateDistances graph (M.adjust (const (addDistance startD (Dist 1))) n dists) nodes startD
|
||||||
in M.mapWithKey (\k d -> if k `elem` nodes && d > dist then addDistance dist (Dist 1) else d) dists
|
|
||||||
|
|
||||||
findShortestPath :: Graph -> DijkstraState -> Coords -> Coords -> Distance Int
|
findShortestPath :: Graph -> DijkstraState -> Coords -> Coords -> Distance Int
|
||||||
findShortestPath graph state start end
|
findShortestPath graph state start end
|
||||||
@ -63,7 +62,7 @@ findShortestPath graph state start end
|
|||||||
let newState =
|
let newState =
|
||||||
state
|
state
|
||||||
{ unvisited = S.delete start (unvisited state),
|
{ unvisited = S.delete start (unvisited state),
|
||||||
distances = updateDistances graph (distances state) start
|
distances = updateDistances graph (distances state) (edges graph M.! start) (distances state M.! start)
|
||||||
}
|
}
|
||||||
nodes = S.toList $ unvisited newState
|
nodes = S.toList $ unvisited newState
|
||||||
next = fst $ minimumBy (compare `on` snd) [(n, distances newState M.! n) | n <- nodes]
|
next = fst $ minimumBy (compare `on` snd) [(n, distances newState M.! n) | n <- nodes]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user