Time: 20190902
Type: Medium
解法:BFS

题目描述

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

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

示例:

给定二维网格:

INF  -1  0  INF
INF INF INF  -1
INF  -1 INF  -10  -1 INF INF

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

  3  -1   0   12   2   1  -11  -1   2  -10  -1   3   4

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

思路

从门开始宽度优先搜索,环一层一层扩散,能被门的光环覆盖到的时候,就是距离门的最短距离。

这非常直接。

前面写题快有一种思维定式是,只有DFS才有上下左右四个探索,其实BFS也一样可以有递归的写法。

要灵活掌握算法背后的思想。本题用BFS的解法是最简单易懂的。

代码

class Solution:def wallsAndGates(self, rooms: List[List[int]]) -> None:"""Do not return anything, modify rooms in-place instead."""if not rooms or len(rooms) == 0:return row = len(rooms)col = len(rooms[0])def bfs(rooms, i, j, val): # val表示环扩展的距离nonlocal row, colif i < 0 or i >= row or j < 0 or j >= col:returnif rooms[i][j] < val: # 如果当前位置已经找到更近的门了,直接返回returnrooms[i][j] = valbfs(rooms, i + 1, j, val + 1)bfs(rooms, i, j + 1, val + 1)bfs(rooms, i - 1, j, val + 1)bfs(rooms, i, j - 1, val + 1)for i in range(row):for j in range(col):if rooms[i][j] == 0:bfs(rooms, i, j, 0)

BFS递归函数带着的val表示当前环向外扩展的距离,每次进入下一层递归时,表示环向外扩散一层,则val + 1

比较有意思的是,rooms[i][j]表示当前点到门的距离,如果本身是-1,则表示不用更新,且会挡住继续探索的路径。

如果是INF,且能遍历到这里来,直接更新为val值。

相似的习题

Leetcode 317.离建筑物最近的距离 Hard
Leetcode 489.扫地机器人 Hard
Leetcode 994.腐烂的橘子 Easy

END.

Leetcode 286.墙与门相关推荐

  1. LeetCode 286. 墙与门(BFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 超时解 2.2 从门开始逆向BFS 1. 题目 你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表 ...

  2. LeetCode 286. 墙与门 多源BFS和DFS

    思路1: DFS,对于每个门进行一次DFS搜索,记录每个位置对每个门的距离,当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for ...

  3. 【leetcode】286. 墙与门

    你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF 无限表示一个空的房间.然后,我们用 231 - 1 = 2147483647 代 ...

  4. Leetcode286墙与门

    286墙与门 #286墙与门 class Solution:def wallsAndGates(self, rooms):EMPTYROOM = 2**31 - 1door = 0neighbors ...

  5. 【LeetCode - 286】墙与门

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路   首先把所有的门的坐标入队.   当队列不为空,则进行一下操作:   1.取出一个坐标点 (x, y):   2.遍历 ...

  6. 【LeetCode286】墙与门(BFS)

    一.题目 给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF 无限表示一个空的房间.然后,我们用 2 31 2^{31} 231 - 1 ...

  7. LeetCode 286 Walls and Gates

    思路 思路1:暴力搜索,对每个空房间(INF)进行bfs,不过此时的bfs应该是每次向队列中加下一层的元素而不是单个元素,否则深度会算错. 时间复杂度O(n2∗m2n^2 * m^2n2∗m2), 空 ...

  8. leetcode 286 周赛回顾

    T1 传送门 比赛时代码,过于冗长 class Solution { public:vector<vector<int>> findDifference(vector<i ...

  9. Leetcode 200.岛屿数量

    Time: 20190902 Type: Medium 题目描述 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地 ...

最新文章

  1. mysql二进制还原表_MYSQL 二进制还原
  2. 《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记
  3. 黑客大佬:我是如何让50个文件一起骗过AI安防系统的?
  4. 【树形DP】 HDU 2196 Computer
  5. python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵
  6. java环境变量配置 - win10
  7. pda连接电脑无法存取文件_手机无法连接电脑怎办
  8. 怎么禁止浏览器自动保存密码?
  9. 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
  10. java方法synchronized_java synchronized方法 – 它是如何工作的
  11. 文章根据时间段显示的微信名和微信号
  12. 3DMAX卸载/完美解决安装失败/如何彻底卸载清除干净3DMAX各种残留注册表和文件的方法
  13. 八爪鱼数据采集教程(一)
  14. Qt开发——图片缩放简述
  15. ubuntu NFS SCP SFTP
  16. 电脑公司 GHOST WIN10 X64 装机专业版 V2018.04(64位)
  17. python量化期权_Python量化期权怎么学?
  18. Unity3d代码及效率优化总结
  19. django 下载安装xadmin(django3.x + python3.6+xadmin2.x)
  20. URL如何转换成pdf?

热门文章

  1. ROS Image_transport使用
  2. 机器学习:单变量线性回归及梯度下降
  3. c语言三种循环语句,C语言三种循环语句的功能等价性
  4. 程序员操作系统推荐_程序员的这些问题,竟然在工作后才发现!
  5. python源码不需要编译成二进制代码_编译 Python 源代码
  6. 佳能7200cdn打印自检_家用打印机如何挑选? 家用打印机性价比较高的有哪些?...
  7. python怎么索引txt数据中第四行_python-在熊猫数据框中按行计数编制索引
  8. java 异步程序,java异步编程
  9. mysql5.6 多实例 主从安装_MySQL5.6一主多从的半同步复制实例
  10. java 方法调用表达式_java lambda怎么表达式判断被调用接口名称和接口中方法