leetcode 286——墙与门

leetcode 286——墙与门(C++提交)

题目链接:leetcode 286——墙与门

题目描述:

你被给定一个 m × n 的二维网格,网格中有以下三种可能的初始化值:

  1. -1 表示墙或是障碍物
  2. 0 表示一扇门
  3. 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;
	}
};
发布了57 篇原创文章 · 获赞 12 · 访问量 3306

猜你喜欢

转载自blog.csdn.net/weixin_44795839/article/details/104081384