leetcode 286——墙与门(C++提交)
题目链接:leetcode 286——墙与门
题目描述:
你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:
- -1 表示墙或是障碍物
- 0 表示一扇门
- INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。
你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。
示例:
给定二维网格:
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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/walls-and-gates
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
提交:
/*
对每个门进行bfs
*/
class Solution {
public:
void wallsAndGates(vector<vector<int>>& rooms) {
if (rooms.empty() || rooms[0].empty()) return; //地图为空时结束掉函数
const int INF = 2147483647;
int m = rooms.size(); //地图行数为m
int n = rooms[0].size(); //地图列数为n
vector<pair<int, int>> directions = { {1,0},{0,1},{-1,0},{0,-1} }; //directions[0]-[3]表示上下左右四个方向
queue<pair<int, int>> q;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (rooms[i][j] == 0) q.push(pair<int, int>(i, j));
}
}
while (!q.empty())
{
pair<int, int> pos = q.front(); q.pop(); //出队
int x = pos.first;
int y = pos.second;
int dp = rooms[x][y] + 1;
for (int i = 0; i < 4; i++)
{
int nx = x + directions[i].first;
int ny = y + directions[i].second;
if (nx >= 0 && nx < m && ny >= 0 && ny < n && rooms[nx][ny] == INF)//下标合法并且下标指定位置为空房间
{
rooms[nx][ny] = dp;
q.push(pair<int, int>(nx, ny)); //入队
}
}
}
return;
}
};