题目描述:
你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:
-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。
示例:
给定二维网格:
INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
运行完你的函数后,该网格应该变成:
3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walls-and-gates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
思路一:
最直接的方法,暴力使用BFS,遍历所有门,为每一个门求解最短距离。首先需要一个队列来存放遍历节点。遍历后的节点可以删掉,这样,从一个节点开始,向周围相邻节点遍历,直至找到门。每一次的遍历,为了避免相邻节点的循环搜索,创建一个和输入同规格的二维数组,用来存放当前节点到起始节点的距离,同时也可以作为是否被遍历的判别条件。
代码如下:
(注意这个代码只通过了59/62个测试用例),第60个测试用例是一个超大的数据,以致于反馈超出时间限制
from collections import deque
from enum import Enum
class constant(Enum):
WALL = -1
DOOR = 0
EMPTYROOM = 2**31 - 1
class Solution:
searchList = deque()
neighbors = [[-1,0],[+1,0],[0,-1],[0,+1]]
finished = deque()
def wallsAndGates(self, rooms) -> None:
"""
Do not return anything, modify rooms in-place instead.
"""
if not rooms:
return
row = len(rooms)
col = len(rooms[0])
for i in range(row):
for j in range(col):
if rooms[i][j] == constant.EMPTYROOM.value:
rooms[i][j] = self.getDistance([i,j],row,col,rooms)
def getDistance(self,emptyRoom , row, col, rooms):
searchList = deque()
searchList.append(emptyRoom)
distance = [[</