LeetCode 1091. Shortest Path in Binary Matrix in F#

URL

leetcode.com/problems/shortest-path-in-bina..

Code

github.com/syohex/dotnet-study/blob/master/..

#r "nuget:FSharpx.Collections"

open FSharpx.Collections

let shortestPathBinaryMatrix (grid: int [,]) : int =
    let steps =
        [ (-1, -1)
          (-1, 0)
          (-1, 1)
          (0, -1)
          (0, 1)
          (1, -1)
          (1, 0)
          (1, 1) ]

    let rows = Array2D.length1 grid
    let cols = Array2D.length2 grid

    let rec shortestPathBinaryMatrix' (q: Queue<(int * int)>) (grid: int [,]) =
        match Queue.tryUncons q with
        | None -> -1
        | Some ((x, y), rest) ->
            if x = rows - 1 && y = cols - 1 then
                grid.[x, y]
            else
                let q' =
                    steps
                    |> List.fold
                        (fun acc (xStep, yStep) ->
                            let row = x + xStep
                            let col = y + yStep

                            if row >= 0
                               && row < rows
                               && col >= 0
                               && col < cols
                               && grid.[row, col] = 0 then
                                grid.[row, col] <- grid.[x, y] + 1
                                Queue.conj (row, col) acc
                            else
                                acc)
                        rest

                shortestPathBinaryMatrix' q' grid

    if grid.[0, 0] = 1 then
        -1
    else
        grid.[0, 0] <- 1
        let q = Queue.empty |> Queue.conj (0, 0)
        shortestPathBinaryMatrix' q grid