LeetCode 1293. Shortest Path in a Grid with Obstacles Elimination in F#
URL
leetcode.com/problems/shortest-path-in-a-gr..
Code
github.com/syohex/dotnet-study/blob/master/..
let shortestPath (grid: int [,]) (k: int) : int =
let rows = Array2D.length1 grid
let cols = Array2D.length2 grid
let moves = [ (1, 0); (0, 1); (-1, 0); (0, -1) ]
let rec shortestPath' (grid: int [,]) q visited =
match q with
| [] -> -1
| (row, col, eliminations, steps) :: t ->
if row = rows - 1 && col = cols - 1 then
steps
else
let newCandidates =
moves
|> List.map (fun (x, y) -> row + x, col + y)
|> List.filter (fun (x, y) -> x >= 0 && x < rows && y >= 0 && y < cols)
|> List.map (fun (x, y) -> x, y, eliminations - grid.[x, y])
|> List.filter (fun (x, y, e) -> e >= 0 && Set.contains (x, y, e) visited |> not)
|> List.map (fun (x, y, e) -> x, y, e, steps + 1)
let newVisited =
newCandidates
|> List.fold (fun acc (x, y, e, _) -> Set.add (x, y, e) acc) visited
let newQ = newCandidates @ t
shortestPath' grid newQ newVisited
shortestPath' grid [ (0, 0, k, 0) ] Set.empty