[Leetcode] 286. Walls and Gates 解题报告
来源:互联网 发布:sim卡没有网络连接 编辑:程序博客网 时间:2024/05/22 10:34
题目:
You are given a m x n 2D grid initialized with these three possible values.
-1
- A wall or an obstacle.0
- A gate.INF
- Infinity means an empty room. We use the value231 - 1 = 2147483647
to representINF
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
思路:
1、DFS:深度优先搜索的代码更加简洁。对于每一个二维矩阵中的0元素,我们对其进行深度优先搜索。其思路是,如果当前格子的的距离大于等于新的距离,就更新当前格子的距离,并且对其四个邻接格子进行深度搜索。需要注意边界情况的控制。
2、BFS:广度优先搜索的思路更加直观。我们维护一个队列,用来表示需要处理的所有格子信息,包括格子的具体位置以及当前距离,队列初始化为二维矩阵中的所有0元素。然后依次对队列的头元素进行处理,直到队列为空。具体处理方法是:如果头结点的某个邻居结点的值为INF,则更新该值,并且将该邻接结点放入队列中。由于保证了队列中“当前距离”的单调递增性,所以我们只需要处理那些距离为INF的邻居结点。
代码:
1、DFS:
class Solution {public: void wallsAndGates(vector<vector<int>>& rooms) { if(rooms.size() == 0 || rooms[0].size() == 0) { return; } int row_num = rooms.size(), col_num = rooms[0].size(); for(int i = 0; i < row_num; ++i) { for(int j = 0; j < col_num; ++j) { if(rooms[i][j] == 0) { DFS(rooms, i, j, 0); } } } }private: void DFS(vector<vector<int>>& rooms, int x, int y, int distance) { int row = rooms.size(), col = rooms[0].size(); if(x < 0 || y < 0 || x >= row || y >= col || rooms[x][y] < distance) { return; } rooms[x][y] = distance++; DFS(rooms, x + 1, y, distance); DFS(rooms, x - 1, y, distance); DFS(rooms, x, y - 1, distance); DFS(rooms, x, y + 1, distance); }};
2、BFS:
class Solution {public: void wallsAndGates(vector<vector<int>>& rooms) { if(rooms.size() == 0 || rooms[0].size() == 0) { return; } int row_num = rooms.size(), col_num = rooms[0].size(); queue<pair<pair<int, int>, int>> q; for(int i = 0; i < row_num; ++i) { for(int j = 0; j < col_num; ++j) { if(rooms[i][j] == 0) { q.push(make_pair(make_pair(i, j), 0)); } } } int INF = INT_MAX; while(!q.empty()) { int row = q.front().first.first, col = q.front().first.second; int distance = q.front().second; q.pop(); if(row > 0 && rooms[row - 1][col] == INF) { rooms[row - 1][col] = distance + 1; q.push(make_pair(make_pair(row - 1, col), distance + 1)); } if(row < row_num - 1 && rooms[row + 1][col] == INF) { rooms[row + 1][col] = distance + 1; q.push(make_pair(make_pair(row + 1, col), distance + 1)); } if(col > 0 && rooms[row][col - 1] == INF) { rooms[row][col - 1] = distance + 1; q.push(make_pair(make_pair(row, col - 1), distance + 1)); } if(col < col_num - 1 && rooms[row][col + 1] == INF) { rooms[row][col + 1] = distance + 1; q.push(make_pair(make_pair(row, col + 1), distance + 1)); } } }};
阅读全文
0 0
- [leetcode] 286. Walls and Gates 解题报告
- [Leetcode] 286. Walls and Gates 解题报告
- Leetcode 286.Walls and Gates
- LeetCode 286. Walls and Gates
- Leetcode 286. Walls and Gates
- LeetCode 286. Walls and Gates
- *LeetCode-Walls and Gates
- Leetcode: Walls and Gates
- 286. Walls and Gates
- 286. Walls and Gates
- leetcode 286: Walls and Gates
- [Leetcode 286]: Walls and Gates
- LeetCode 286. Walls and Gates(墙与门)
- LeetCode 题解(259) : Walls and Gates
- [LeetCode286]Walls and Gates
- Walls and Gates
- Walls and Gates
- Walls and Gates
- 浅谈C++多态性
- 7.11 模拟赛
- HTTP状态码
- JDK1.6集合框架bug:c.toArray might (incorrectly) not return Object[] (see 6260652)
- js小知识
- [Leetcode] 286. Walls and Gates 解题报告
- Redis 列表 常用命令
- 敏捷教练的六顶帽子|洞见
- 3D Tiles介绍(一)
- 第7章 启动和关闭Greenplum数据库
- 49day 通讯录&静态库&二维码
- android StringBuffer的使用
- 集合框架学习
- 面向对象三个基本特征