zoukankan      html  css  js  c++  java
  • 286. Walls and Gates

    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))
                            
                                
  • 相关阅读:
    基于Antlr4编写DSL
    【整理】ANTLR应用案例 | 在路上
    【整理】ANTLR应用案例 | 在路上
    The ANTLR Parser Generator
    ANTLR4权威参考手册
    ANTLR Examples
    ANTLRWorks: The ANTLR GUI Development Environment
    http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html
    写一个编译器
    写一个编译器
  • 原文地址:https://www.cnblogs.com/prmlab/p/7226267.html
Copyright © 2011-2022 走看看