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))
                            
                                
  • 相关阅读:
    [TCP/IP] HTTPS的工作原理
    [TCP/IP] SSL的通讯原理
    ESLint笔记
    MacBook Pro维修过程
    论前端工程化
    听书,怅然若失
    js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
    Windows和Mac浏览器启动本地程序
    科目三(番禺化龙展贸东路)考试录20170224
    写jQuery插件该注意的
  • 原文地址:https://www.cnblogs.com/prmlab/p/7226267.html
Copyright © 2011-2022 走看看