题目:
ou 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题解:
先自己写了一下, 注意优化条件是相邻元素的值如果大于当前值加1,就不需考虑相邻元素了:
class Solution {
public:
void wallsAndGates(vector<vector<int>>& rooms) {
if(rooms.size() == 0)
return;
vector<vector<bool>> visited(rooms.size(), vector<bool>(rooms[0].size(), false));
for(int i = 0; i < rooms.size(); i++) {
for(int j = 0; j < rooms[0].size(); j++) {
if(rooms[i][j] == 0) {
if (i - 1 >= 0 && rooms[i - 1][j] > rooms[i][j] + 1)
distance(rooms, visited, i - 1, j, 1);
if (i + 1 < rooms.size() && rooms[i + 1][j] > rooms[i][j] + 1)
distance(rooms, visited, i + 1, j, 1);
if (j - 1 >= 0 && rooms[i][j - 1] > rooms[i][j] + 1)
distance(rooms, visited, i, j - 1, 1);
if (j + 1 < rooms[0].size() && rooms[i][j + 1] > rooms[i][j] + 1)
distance(rooms, visited, i, j + 1, 1);
}
}
}
}
void distance(vector<vector<int>>& rooms, vector<vector<bool>>& visited, int i, int j, int d) {
if (i < 0 || i > rooms.size() - 1 || j < 0 || j > rooms[0].size() - 1)
return;
if (rooms[i][j] == -1 || rooms[i][j] == 0)
return;
if (visited[i][j])
rooms[i][j] = min(rooms[i][j], d);
else {
rooms[i][j] = d;
visited[i][j] = true;
}
if (i - 1 >= 0 && rooms[i - 1][j] > rooms[i][j] + 1)
distance(rooms, visited, i - 1, j, d + 1);
if (i + 1 < rooms.size() && rooms[i + 1][j] > rooms[i][j] + 1)
distance(rooms, visited, i + 1, j, d + 1);
if (j - 1 >= 0 && rooms[i][j - 1] > rooms[i][j] + 1)
distance(rooms, visited, i, j - 1, d + 1);
if (j + 1 < rooms[0].size() && rooms[i][j + 1] > rooms[i][j] + 1)
distance(rooms, visited, i, j + 1, d + 1);
}
};
网上学来Queue的简便写法: