1926. 迷宫中离入口最近的出口

196 阅读2分钟

题目:
给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 '.' 表示)和墙(用 '+' 表示)。同时给你迷宫的入口 entrance ,用 entrance = [entrancerow, entrancecol] 表示你一开始所在格子的行和列。

每一步操作,你可以往 或者  移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离 entrance 最近 的出口。出口 的含义是 maze 边界 上的 空格子entrance 格子 不算 出口。

请你返回从 entrance 到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回 -1 。
算法:
方法一:BFS

func nearestExit(maze [][]byte, entrance []int) int {
    m := len(maze)
    n := len(maze[0])
   
    dirs := [][]int{[]int{-1, 0},[]int{1, 0},[]int{0, 1},[]int{0, -1}}
    visited := make([][]int, m)
    for i := range visited {
        visited[i] = make([]int, n)
    }
    // visited[entrance[0]][entrance[1]] = 1
    queue := []pos{pos{entrance[0], entrance[1]}}

    for step := 0; len(queue) != 0; step ++ {
        length := len(queue)
        for i := 0; i < length; i ++ {
            x, y := queue[i].i, queue[i].j
            if visited[x][y] == 1 {
                continue
            }
            visited[x][y] = 1
            // 现在是出口吗
            if (x == 0 || y == 0 || x == m - 1 || y == n - 1 ) && !(x == entrance[0] && y == entrance[1]) {
                // fmt.Println(x, y, entrance)
                return step
            }
            for _, dir := range dirs {
                newX, newY := x + dir[0], y + dir[1]
                if 0 <= newX && newX < m && 0 <= newY && newY < n && maze[newX][newY] != '+' {
                    queue = append(queue, pos{newX, newY})
                    
                }
            }
        }
        queue = queue[length:]
    }
    return -1
}

type pos struct{
    i int
    j int
}

看起来内存使用有点高,原来扣友把遍历过的'.'改成了'+' 图片.png
优化空间后的代码:

func nearestExit(maze [][]byte, entrance []int) int {
    m := len(maze)
    n := len(maze[0])
   
    dirs := [][]int{[]int{-1, 0},[]int{1, 0},[]int{0, 1},[]int{0, -1}}
    queue := []pos{pos{entrance[0], entrance[1]}}
    maze[entrance[0]][entrance[1]] = '+'
    for step := 0; len(queue) != 0; step ++ {
        length := len(queue)
        for i := 0; i < length; i ++ {
            x, y := queue[i].i, queue[i].j
            // 现在是出口吗
            if (x == 0 || y == 0 || x == m - 1 || y == n - 1 ) && !(x == entrance[0] && y == entrance[1]) {
                return step
            }
            for _, dir := range dirs {
                newX, newY := x + dir[0], y + dir[1]
                if 0 <= newX && newX < m && 0 <= newY && newY < n && maze[newX][newY] != '+' {
                    queue = append(queue, pos{newX, newY})
                    maze[newX][newY] = '+' 
                }
            }
        }
        queue = queue[length:]
    }
    return -1
}

type pos struct{
    i int
    j int
}

图片.png 你们可真是小机灵鬼!