LeetCode-【BFS】解题技巧

LeetCode题目:地图分析

题目分析(分析转自sweetiee):

这是一道典型的BFS基础应用,为什么这么说呢?
因为我们只要先把所有的陆地都入队,然后从各个陆地同时开始一层一层的向海洋扩散,那么最后扩散到的海洋就是最远的海洋!
并且这个海洋肯定是被离他最近的陆地给扩散到的!
下面是扩散的图示,1表示陆地,0表示海洋。每次扩散的时候会标记相邻的4个位置的海洋:

LeetCode-【BFS】解题技巧_第1张图片
你可以想象成你从每个陆地上派了很多支船去踏上伟大航道,踏遍所有的海洋。每当船到了新的海洋,就会分裂成4条新的船,向新的未知海洋前进(访问过的海洋就不去了)。如果船到达了某个未访问过的海洋,那他们是第一个到这片海洋的。很明显,这么多船最后访问到的海洋,肯定是离陆地最远的海洋。

    def maxDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 使用数组模拟队列
        data = []
        raw = len(grid)
        col = len(grid[0])
        for r in range(raw):
            for c in range(col):
                if grid[r][c] == 1:
                    data.append([r,c])
        d = [(0,-1),(0,1),(1,0),(-1,0)]
        res = -1
        # 保持队列有序pop
        while data:
            x,y = data.pop(0)
            # 将其四周的海洋入队
            for i,j in d:
                c_x,c_y = x+i,y+j
                # 1)判断边界;2)判断该点是否已遍历
                if c_x >= 0 and c_x < raw and c_y >= 0 and c_y < col and grid[c_x][c_y] == 0:
                    # 标记海洋为已访问
                    grid[c_x][c_y] = grid[x][y]+1
                    ¥ 将海洋加入到队列
                    data.append([c_x,c_y])
                    res=grid[x][y]
        return res

 

你可能感兴趣的:(LeetCode)