LeetCode 1926. Nearest Exit from Entrance in Maze in F#

URL

leetcode.com/problems/nearest-exit-from-ent..

Code

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

let nearestExit (maze: char [,]) ((row, col): int * int) : int =
    let rows = Array2D.length1 maze
    let cols = Array2D.length2 maze

    let rec nearestExit' (q: (int * int * int) list) (maze: char [,]) =
        match q with
        | [] -> -1
        | _ ->
            let rev = List.rev q
            let (row, col, step) = rev |> List.head

            if row < 0 || row >= rows || col < 0 || col >= cols then
                if step = 1 then
                    nearestExit' (List.tail rev) maze
                else
                    step - 1
            else
                let steps = [ (-1, 0); (0, -1); (1, 0); (0, 1) ]

                let q' =
                    steps
                    |> List.fold
                        (fun acc (x, y) ->
                            let newX, newY = row + x, col + y

                            if newX < 0
                               || newX >= rows
                               || newY < 0
                               || newY >= cols then
                                (newX, newY, step + 1) :: acc
                            elif newX >= 0
                                 && newX < rows
                                 && newY >= 0
                                 && newY <= cols
                                 && maze.[newX, newY] = '.' then
                                maze.[newX, newY] <- '+'
                                (newX, newY, step + 1) :: acc
                            else
                                acc)
                        (rev |> List.tail)

                nearestExit' q' maze

    maze.[row, col] <- '+'
    nearestExit' [ (row, col, 0) ] maze