博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Walls and Gates
阅读量:5883 次
发布时间:2019-06-19

本文共 4287 字,大约阅读时间需要 14 分钟。

Problem Description:

You are given a m x n 2D grid initialized with these three possible values.

  1. -1 - A wall or an obstacle.
  2. 0 - A gate.
  3. INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than2147483647.

Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF.

For example, given the 2D grid:

INF  -1  0  INFINF INF INF  -1INF  -1 INF  -1  0  -1 INF INF

 After running your function, the 2D grid should be:

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

An application of BFS. The key is to apply appropriate pruning. shares a very clear solution in Python, which is rewritten in C++ as follows.

1 class Solution { 2 public: 3     void wallsAndGates(vector
>& rooms) { 4 if (rooms.empty()) return; 5 int m = rooms.size(), n = rooms[0].size(); 6 for (int i = 0; i < m; i++) { 7 for (int j = 0; j < n; j++) { 8 if (!rooms[i][j]) { 9 queue
grids;10 grids.push(Grid(i + 1, j, 1));11 grids.push(Grid(i - 1, j, 1));12 grids.push(Grid(i, j + 1, 1));13 grids.push(Grid(i, j - 1, 1));14 while (!grids.empty()) {15 Grid grid = grids.front();16 grids.pop();17 int r = grid.r, c = grid.c, d = grid.d;18 if (r < 0 || r >= m || c < 0 || c >= n || rooms[r][c] < d)19 continue;20 rooms[r][c] = d;21 grids.push(Grid(r + 1, c, d + 1));22 grids.push(Grid(r - 1, c, d + 1));23 grids.push(Grid(r, c + 1, d + 1));24 grids.push(Grid(r, c - 1, d + 1));25 }26 }27 }28 }29 }30 private:31 struct Grid {32 int r, c, d;33 Grid(int _r, int _c, int _d) : r(_r), c(_c), d(_d) {}34 };35 };

Stefan posts a nice C++ solution using #define helper functions , which is rewritten below using private functions.

1 class Solution { 2 public: 3     void wallsAndGates(vector
>& rooms) { 4 int m = rooms.size(), n = m ? rooms[0].size() : 0; 5 queue
> q; 6 for (int i = 0; i < m; i++) 7 for (int j = 0; j < n; j++) 8 if (!rooms[i][j]) q.push({i, j}); 9 for (int d = 1; !q.empty(); d++) {10 for (int k = q.size(); k; k--) {11 int i = q.front().first, j = q.front().second;12 q.pop();13 add(rooms, q, i - 1, j, m, n, d);14 add(rooms, q, i + 1, j, m, n, d);15 add(rooms, q, i, j - 1, m, n, d);16 add(rooms, q, i, j + 1, m, n, d); 17 }18 }19 }20 private:21 void add(vector
>& rooms, queue
>& q, int i, int j, int m, int n, int d) {22 if (i >= 0 && i < m && j >= 0 && j < n && rooms[i][j] > d) {23 q.push({i, j});24 rooms[i][j] = d;25 }26 }27 };

 has suggested the following solution, which I find more concise :-) 

1 class Solution { 2 public: 3     void wallsAndGates(vector
>& rooms) { 4 if (rooms.empty()) return; 5 int m = rooms.size(), n = rooms[0].size(); 6 queue
> q; 7 vector
> dirs = { { 1, 0}, { 0, 1}, {-1, 0}, { 0, -1}}; 8 for (int i = 0; i < m; i++) 9 for (int j = 0; j < n; j++)10 if (!rooms[i][j])11 q.push(make_pair(i, j));12 while (!q.empty()) {13 int r = q.front().first, c = q.front().second;14 q.pop();15 for (auto dir : dirs) {16 int x = r + dir.first, y = c + dir.second;17 if (x < 0 || y < 0 || x >= m || y >= n || rooms[x][y] <= rooms[r][c] + 1)18 continue;19 rooms[x][y] = rooms[r][c] + 1;20 q.push(make_pair(x, y));21 }22 }23 }24 };

 

转载于:https://www.cnblogs.com/jcliBlogger/p/4836567.html

你可能感兴趣的文章
Redis分布式锁的正确实现方式
查看>>
Linux找回缺少的命令
查看>>
镭速介绍关于高速数据传输!
查看>>
mysql中使用enum,如何获取所有可能的值
查看>>
数据连通这件事,英特尔也很上心
查看>>
阿里云首次在ASPLOS'19发布重磅论文:揭秘帮助ECS快速迭代的热升级技术
查看>>
基于快速GeoHash,如何实现海量商品与商圈的高效匹配?
查看>>
seo知否:死链对于网站的利与弊【对网站的特殊影响】
查看>>
荣耀品牌全面升级背后:以战代守,深蹲起跳
查看>>
这本书会是你在算法分析道路上最好的养料
查看>>
Unity组件:Lens Flare 镜头光晕
查看>>
来啃硬骨头——费波纳茨(Fibonacci)矩阵快速幂 c++
查看>>
我被阿里云美女清宵的观后感给撩了
查看>>
进一步成熟,Chrome OS 提供了更完整的 USB 支持
查看>>
Chrome 正在测试新的扩展菜单
查看>>
USB-IF 再度为 USB 3 改名,这次更难辨别了
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.11. 文本搜索类型
查看>>
smartforms相关知识
查看>>
香港美食记录(物价参考)
查看>>
Oracle DG 备库恢复--gap
查看>>