Premiumlab  

https://leetcode.com/problems/walls-and-gates/#/description

 

You are given a m x n 2D grid initialized with these three possible values.

  1. -1 - A wall or an obstacle.
  2. 0 - A gate.
  3. INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than 2147483647.

Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF.

For example, given the 2D grid:

INF  -1  0  INF
INF INF INF  -1
INF  -1 INF  -1
  0  -1 INF INF

 

After running your function, the 2D grid should be:

  3  -1   0   1
  2   2   1  -1
  1  -1   2  -1
  0  -1   3   4

 

 

 

Sol:

 

import collections
class Solution(object):
    def wallsAndGates(self, rooms):
        """
        :type rooms: List[List[int]]
        :rtype: void Do not return anything, modify rooms in-place instead.
        """
        # BFS
        if not rooms:
            return
        r, c = len(rooms), len(rooms[0])
        for i in range(r):
            for j in range(c):
                if rooms[i][j] == 0:
                    # append each element to a queue
                    # queue here is to transfer a matrix into a queue
                    queue = collections.deque([])
                    queue.append((i+1, j, 1))
                    queue.append((i-1, j, 1))
                    queue.append((i, j+1, 1))
                    queue.append((i, j-1, 1))
                    # visited stores elements popped out from queue, and it is added under certain conditions
                    visited = set()
                    while queue:
                        # pop elements from queue and check if it is visited
                        x, y, val = queue.popleft()
                        if x < 0 or x >= r or y < 0 or y >= c or rooms[x][y] in [0, -1] or (x,y) in visited:
                            continue
                        # add unvisited elements to visited set
                        visited.add((x,y))
                        rooms[x][y] = min(rooms[x][y], val)
                        # add the value of distance in the queue
                        queue.append((x+1, y, val+1))
                        queue.append((x-1, y, val+1))
                        queue.append((x, y-1, val+1))
                        queue.append((x, y+1, val+1))
                        
                            

 

posted on 2017-07-23 21:47  Premiumlab  阅读(113)  评论(0)    收藏  举报