leetcode bfs 1162

BFS常规思路

while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点(上下左右):
if 该节点满足边界条件且未访问过:
queue.push(该节点)

计数方法通过层次遍历 遍历层次+1 计数+1

Leetcode 1162

题目要求:
你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1。

思路
point1:行、列数 以及设置visit_list (全为0,加入队列则表示为第n层次的点,并将赋值改为1)
point2:对队列中的点进行上下左右移动 直至所有点均为访问过(visit全为1)
point3:返回res需要-1 原因是在倒数第二层时,会将倒数第一层的点添加进队列,此时访问列表中,已经均被访问,无需进入下一层。
point4:全为陆地以及全为海洋,也就是全为0或者全为1的情况判断,全为0时,len(queue)=0 全为1时,len(queue0 = col*row

class Solution:
    def maxDistance(self, grid: List[List[int]]) -> int:
        col = len(grid)
        row = len(grid[0])
        queue = collections.deque()
        visit_list = [[0]*row for i in range(col)]
        for i in range(col):
            for j in range(row):
                if grid[i][j] == 1:
                    queue.append((i,j))
                    visit_list[i][j] = 1
        res = 0
        move_step = [[0,1],[0,-1],[1,0],[-1,0]]
        while queue:
            size = len(queue)
            if size == col*row:
                return -1
            for i in range(size):
                x,y = queue.popleft()
                for dx,dy in move_step:
                    new_x,new_y = x + dx, y + dy
                    if new_x < 0 or new_y < 0 or new_x >= col or new_y >= row or visit_list[new_x][new_y] == 1:
                        continue
                    queue.append((new_x,new_y))
                    visit_list[new_x][new_y] = 1
            res += 1
        return res - 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值