Question:
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 INF
INF INF INF -1
INF -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.
分析:
题目意思是,-1表示栅栏或墙,0表示门,INF表示一个最大值,写一个函数更改INF为距离最近的门的最近距离值。
方法为广度优先算法,就是按层找门0,然后判断门的
上下左右位置是否为栅栏或是出了边界,或者是否已经存在比当前距离还小的距离值了,如果都不是,则更改为当前距离值。
为了避免混乱,用队列进行其他位置的距离更改。首先从四个周围的点开始,然后按照层序遍历依次入队出队判断。
其中剪枝条件是:是否除了边界,是否为门,是否为栅栏。
代码如下(参考):
class Solution {
public:
void wallsAndGates(vector<vector<int>>& rooms) {
if (rooms.empty()) return;
int m = rooms.size(), n = rooms[0].size();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!rooms[i][j]) {
queue<Grid> grids;
grids.push(Grid(i + 1, j, 1));
grids.push(Grid(i - 1, j, 1));
grids.push(Grid(i, j + 1, 1));
grids.push(Grid(i, j - 1, 1));
while (!grids.empty()) {
Grid grid = grids.front();
grids.pop();
int r = grid.r, c = grid.c, d = grid.d;
if (r < 0 || r >= m || c < 0 || c >= n || rooms[r][c] < d)
continue;
rooms[r][c] = d;
grids.push(Grid(r + 1, c, d + 1));
grids.push(Grid(r - 1, c, d + 1));
grids.push(Grid(r, c + 1, d + 1));
grids.push(Grid(r, c - 1, d + 1));
}
}
}
}
}
private:
struct Grid {
int r, c, d;
Grid(int _r, int _c, int _d) : r(_r), c(_c), d(_d) {}
};
};