### 286. Walls and Gates 题目: https://leetcode.com/problems/walls-and-gates/ 难度 : Medium 思路: 乍一看feel like all pairs shortest path. naive的想法是针对所有为0的点做all pairs shortest path,然后最终得到的就是把INF替换保留最小的。时间复杂度是0的个数* BFS naive的想法AC ``` class Solution(object): def wallsAndGates(self, rooms): """ :type rooms: List[List[int]] :rtype: void Do not return anything, modify rooms in-place instead. """ def legal(x,y): return x >= 0 and x < row and y >= 0 and y < col and rooms[x][y] != -1 def bfs(rooms, i, j): queue = [] queue.append((i,j)) while queue: (x,y) = queue.pop() if legal(x-1,y) and rooms[x-1][y] > rooms[x][y] + 1: rooms[x-1][y] = rooms[x][y] + 1 queue.append((x-1,y)) if legal(x+1,y) and rooms[x+1][y] > rooms[x][y] + 1 : rooms[x+1][y] = rooms[x][y] + 1 queue.append((x+1,y)) if legal(x,y-1) and rooms[x][y-1] > rooms[x][y] + 1: rooms[x][y-1] = rooms[x][y] + 1 queue.append((x,y-1)) if legal(x,y+1) and rooms[x][y+1] > rooms[x][y] + 1 : rooms[x][y+1] = rooms[x][y] + 1 queue.append((x,y+1)) row = len(rooms) col = len(rooms[0]) if row else 0 for i in range(row): for j in range(col): if rooms[i][j] == 0: bfs(rooms,i,j) ``` 复习一下BFS的伪码 from wikipedia, 一开始有点小迷茫,那就是为什么没有keep一个visited的数据结构,但是随即反应过来,其实`n.distance == INFINITY` 已经是check它是否被visited 过了,我以上的代码并没有做这个操作,但是因为是格子状以及我仅在检查是否更小,所以也能AC. ``` Breadth-First-Search(Graph, root): for each node n in Graph: n.distance = INFINITY n.parent = NIL create empty queue Q root.distance = 0 Q.enqueue(root) while Q is not empty: current = Q.dequeue() for each node n that is adjacent to current: if n.distance == INFINITY: n.distance = current.distance + 1 n.parent = current Q.enqueue(n) ```