题目:
给你一个 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
}
看起来内存使用有点高,原来扣友把遍历过的'.'改成了'+'
优化空间后的代码:
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
}
你们可真是小机灵鬼!