Python实现数据结构与算法——墙与门

博客介绍了如何使用Python的BFS算法解决LeetCode上的'墙与门'问题。文章详细分析了两种解题思路,包括从门开始遍历的BFS方法,并给出了具体的代码实现,同时分享了在处理大型数据时的优化思考和踩到的坑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:

-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。

示例:

给定二维网格:

INF -1 0 INF
INF INF INF -1
INF -1 INF -1
0 -1 INF INF
运行完你的函数后,该网格应该变成:

3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walls-and-gates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

思路一:

最直接的方法,暴力使用BFS,遍历所有门,为每一个门求解最短距离。首先需要一个队列来存放遍历节点。遍历后的节点可以删掉,这样,从一个节点开始,向周围相邻节点遍历,直至找到门。每一次的遍历,为了避免相邻节点的循环搜索,创建一个和输入同规格的二维数组,用来存放当前节点到起始节点的距离,同时也可以作为是否被遍历的判别条件。

代码如下:
(注意这个代码只通过了59/62个测试用例),第60个测试用例是一个超大的数据,以致于反馈超出时间限制

from collections import deque
from enum import Enum

class constant(Enum):
    WALL = -1
    DOOR = 0
    EMPTYROOM = 2**31 - 1

class Solution:
    searchList = deque()
    neighbors = [[-1,0],[+1,0],[0,-1],[0,+1]]
    finished = deque()
    def wallsAndGates(self, rooms) -> None:
        """
        Do not return anything, modify rooms in-place instead.
        """
        if not rooms:
            return
        row = len(rooms)
        col = len(rooms[0])
        for i in range(row):
            for j in range(col):
                if rooms[i][j] == constant.EMPTYROOM.value:
                    rooms[i][j] = self.getDistance([i,j],row,col,rooms)
            
    def getDistance(self,emptyRoom , row, col, rooms):
        searchList = deque()
        searchList.append(emptyRoom)
        distance = [[</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值