leetcode 1162.地图分析 python BFS 宽度优先搜索

leetcode 1162.地图分析

题目描述

在这里插入图片描述

题解

这是一道典型的应用BFS的题。 nettee的题解 写得很好,很清楚。这位大神应该是擅长java的,所以python的代码写得不是很简洁,但是思路真的很好。

BFS的特点就是一层层地遍历,方便计算层数。DFS是先一条分支走到头,再下一条分支。

首先,循环一遍表格,找出所有的陆地,这就作为第0层的起点。
用一个变量distance记录层数。
开始BFS,整体用一个while循环,用来判断是否所有节点都走过一遍了。

  • 先用一个变量n记录这一层有几个节点,这n个节点就是父节点,要将这几个节点都走过一遍后再到它们的子节点。
  • 当循环到最后,就说明这个是最远的海洋,因为最开始的起点就是全部的陆地,所有的陆地都是同一层,在循环n里同时开始遍历。

我根据思路写了一遍代码

class Solution:
    def maxDistance(self, grid: List[List[int]]) -> int:
        land = []
        L = len(grid)

        for i in range(L):
            for j in range(L):
                if grid[i][j]:
                    land.append([i,j])
                    grid[i][j] = 2
        # 如果全是陆地或海洋
        if not land or len(land) == L*L:
            return -1
        
        direction = [[1,0],[-1,0],[0,1],[0,-1]]
        distance = -1 # 注意这里要从-1开始,如果不明白的话,可以spyder断点运行一遍
        while land:
            distance += 1
            n = len(land) # 将这一层的节点都划分出来循环
            for k in range(n):
                i,j = land.pop(0)
                for w,q in direction:
                    raw,col = i+w,j+q
                    if -1<raw<L and -1<col<L and grid[raw][col]==0:
                        grid[raw][col] = 2
                        land.append([raw,col])
            
        return distance
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值