一、题目

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

-1 表示墙或是障碍物
0 表示一扇门
INF 无限表示一个空的房间。然后,我们用 2 31 2^{31} 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。

你要给每个空房间位上填上该房间到 最近门的距离,如果无法到达门,则填 INF 即可。

样例1:

输入:
[[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]]输出:
[[3,-1,0,1],[2,2,1,-1],[1,-1,2,-1],[0,-1,3,4]]解释:
2D网络为:
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

二、思路

(1)先将所有门入队,从所有门开始BFS,入队的是点坐标,可以用pair结构。
(2)入队时更新距离,而不是出队时,防止重复入队。
(3)更新的条件是rooms[newx][newy] > rooms[x][y] + 1,这里的rooms[x][y] + 1在本轮次(从该当前门开始BFS)遍历中本该属于该节点的树高度,如果这个高度(路径)更小自然就要更新了。

三、代码

class Solution {private:vector<pair<int, int>>directions{{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
public:void wallsAndGates(vector<vector<int>>& rooms) {if(rooms.empty()){return;}int row = rooms.size();int col = rooms[0].size();       queue<pair<int, int>> q;//先将所有门入队for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(rooms[i][j] == 0){q.push(make_pair(i, j));}}}while(!q.empty()){pair<int, int>a = q.front();int x = a.first, y = a.second;q.pop();for(auto dir: directions){int newx = x + dir.first, newy = y + dir.second;if(isarea(rooms, newx, newy) && rooms[newx][newy] > rooms[x][y] + 1){q.push(make_pair(newx, newy));rooms[newx][newy] = rooms[x][y] + 1;}}}}bool isarea(vector<vector<int>>&rooms, int x, int y){return (x >= 0 && x < rooms.size() && y >= 0 && y < rooms[0].size());}
};

【LeetCode286】墙与门(BFS)相关推荐

  1. Leetcode286墙与门

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

  2. LeetCode 286. 墙与门(BFS)

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

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

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

  4. Leetcode 286.墙与门

    Time: 20190902 Type: Medium 解法:BFS 题目描述 你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值: -1 表示墙或是障碍物 0 表示一扇门 INF ...

  5. 【leetcode】286. 墙与门

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

  6. 【LeetCode - 286】墙与门

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

  7. 【C++】BFS类型题目总结

    文章目录 1.墙与门 2.图像渲染 3.01 矩阵 4.岛屿数量 5.钥匙和房间 6.机器人移动范围 1.墙与门 题目连接 题目描述: 注意: m == rooms.length n == rooms ...

  8. 牛客小白月赛24C 十面埋伏(bfs+模拟)

    题目链接 思路:说实话一开始没怎么读懂题意,但乱搞也就过了...先把士兵当成墙,bfs求一下可以遍历到的点,接着再看看这些点的上下左右是否有士兵,有的话就变成*. #include<bits/s ...

  9. leetcode总结

    目录 1610. 可见点的最大数目 链表 合并链表 148. 排序链表    21. 合并两个有序链表   23. 合并K个升序链表 反转链表  92. 反转链表 II  206. 反转链表  143 ...

最新文章

  1. Ubuntu 10.04 LTS 网站权限不够
  2. 访问MS Access 系统表 MSysObjects ,在SQL SERVER 2005中访问
  3. TensorRT(6)-INT8 inference
  4. css 剪辑图片_CSS中的clip-path裁剪图片用法
  5. 【专题】多角度深入解析开放原子开源基金会
  6. 基础组件完善的今天,如何通过业务组件提效?
  7. 第15章 使用DOM的脚本语言
  8. Tomcat6.0配置集合
  9. 计算机文件系统小结,文件系统总结
  10. 一本通1586【 例 2】数字游戏
  11. java mongodb geo,通过GeoServer在MongoDB中提供地理空间数据
  12. 【MATLAB深度学习工具箱】学习笔记--Deep Network Designer学习--组成和使用方法
  13. java从入门到精通 人民邮电_Java从入门到精通【人民邮电出版社】课后习题答案全集...
  14. Android系统QFIL刷机流程
  15. 高等数学辅导讲义_《高等数学》考研自用框架体系
  16. 东南大学本 硕 博论文中期答辩 毕业答辩ppt模板2021版
  17. BUUCTF-Misc-sqltest(happyctf)
  18. 主流视频编码器特点、优缺点归纳和比较(H.264、HEVC、VP9、AV1)
  19. 【服务器数据恢复】服务器断电导致RAID报错的数据恢复案例
  20. 安装版—安装MySQL

热门文章

  1. 历年高考专业录取分数线 API 接口
  2. 自定义Button实现百分比宽度
  3. Ubuntu ip报错解决方案 ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
  4. 【前端优化】Externals 实现运行时加载依赖
  5. 大数据模式让假货无处遁形
  6. java的amazons3增删改,Java AmazonS3.deleteObject方法代码示例
  7. 中石油oj 奥运会跳水比赛 C++ sort函数对结构体的排序
  8. 微信jssdk图片上传 ios不支持
  9. 老年大学计算机培训教材,老年大学摄影教材.pdf
  10. PGA112程控增益放大器