您将获得一个使用这三个可能值初始化的 m×n 2D 网格。-1
- 墙壁或障碍物。0
- 门。INF
- Infinity是一个空房间。我们使用值 2 ^ 31 - 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 -1
0 -1 INF INF
答案为:
3 -1 0 1
2 2 1 -1
1 -1 2 -1
0 -1 3 4
样例2
输入:
[[0,-1],[2147483647,2147483647]]
输出:
[[0,-1],[1,2]]
class Solution {
public:
/**
* @param rooms: m x n 2D grid
* @return: nothing
*/
int m;
int n;
void wallsAndGates(vector<vector<int>> &rooms) {
// write your code here
m = rooms.size();
n = rooms[0].size();
for(int i = 0; i < m; i++)
for(int j = 0; j < rooms[i].size(); j++)
{
if(rooms[i][j] == 2147483647)
{
int res = INT_MAX;
dfs(rooms,i,j,0,res);
if(res == INT_MAX)
{
}
else
{
rooms[i][j] = res;
}
}
}
}
void dfs(vector<vector<int>> &rooms, int x, int y, int step, int& res)
{
if(!isarea(x,y))
return;
if(rooms[x][y] == 0)
{
res = min(res, step);
return;
}
if(rooms[x][y] < 0)
return;
int copy = rooms[x][y];
rooms[x][y] = -2;
dfs(rooms,x-1,y,step+1,res);
dfs(rooms,x,y+1,step+1,res);
dfs(rooms,x+1,y,step+1,res);
dfs(rooms,x,y-1,step+1,res);
rooms[x][y] = copy;
}
bool isarea(int x , int y)
{
if(x < 0 || y < 0 || x >= m || y >= n)
return false;
return true;
}
};
来源:https://blog.csdn.net/weixin_41791402/article/details/101118957