前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 286. 墙与门(BFS)

LeetCode 286. 墙与门(BFS)

作者头像
Michael阿明
发布2020-07-13 15:10:50
1.1K0
发布2020-07-13 15:10:50
举报
文章被收录于专栏:Michael阿明学习之路

1. 题目

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

  • -1 表示墙或是障碍物
  • 0 表示一扇门
  • INF 无限表示一个空的房间。然后,我们用 231 - 1 = 2147483647 代表 INF。你可以认为通往门的距离总是小于 2147483647 的。

你要给每个空房间位上填上该房间到 最近 门的距离,如果无法到达门,则填 INF 即可。

代码语言:javascript
复制
示例:
给定二维网格:
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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 BFS 超时解

  • 对每个点进行BFS,超时
代码语言:javascript
复制
class Solution {
public:
    void wallsAndGates(vector<vector<int>>& rooms) {
        if(rooms.size()==0 || rooms[0].size()==0) return;
        int INF = INT_MAX, i, j, k,step,size,x,y,nx,ny;
        int m = rooms.size(), n = rooms[0].size();
        vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
        for(i = 0; i < m; ++i)
        {
        	for(j = 0; j < n; ++j)
        	{
        		if(rooms[i][j]!=INF)
        			continue;
        		vector<vector<bool>> visited(m, vector<bool>(n,false));
        		visited[i][j] = true;
        		queue<vector<int>> q;
        		q.push({i,j});
        		step = 0;
        		bool found = false;
        		while(!q.empty())
        		{
        			size = q.size();
        			while(size--)
        			{
	        			x = q.front()[0];
	        			y = q.front()[1];
	        			q.pop();
	        			if(rooms[x][y]==0)
	        			{
	        				rooms[i][j] = step;
	        				found = true;
	        				break;
	        			}
	        			for(k = 0; k < 4; ++k)
	        			{
	        				nx = x + dir[k][0];
	        				ny = y + dir[k][1];
	        				if(nx>=0 && nx<m && ny>=0 && ny<n 
	        					&& !visited[nx][ny] && rooms[nx][ny] != -1)
	        				{
	        					q.push({nx,ny});
	        					visited[nx][ny] = true;
	        				}
	        			}
	        		}
	        		if(found)
	        			break;
	        		step++;
        		}
        	}
        }
    }
};

2.2 从门开始逆向BFS

  • 对所有的门同时进行BFS,逆向考虑,每个位置最多访问一次
代码语言:javascript
复制
class Solution {
public:
    void wallsAndGates(vector<vector<int>>& rooms) {
        if(rooms.size()==0 || rooms[0].size()==0) return;
        int INF = INT_MAX, i, j, k,step = 0,size,x,y,nx,ny;
        int m = rooms.size(), n = rooms[0].size();
        vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
        vector<vector<bool>> visited(m, vector<bool>(n,false));        
        queue<vector<int>> q;
        for(i = 0; i < m; ++i)
        {
        	for(j = 0; j < n; ++j)
        	{
        		if(rooms[i][j]==0)
        		{
                    visited[i][j] = true;
                    q.push({i,j});
                }
            }
        }
        while(!q.empty())
        {	
        	size = q.size();
            while(size--)
            {
                x = q.front()[0];
                y = q.front()[1];
                q.pop();
                if(rooms[x][y]==INF)
                {
                    rooms[x][y] = step;
                }
                for(k = 0; k < 4; ++k)
                {
                    nx = x + dir[k][0];
                    ny = y + dir[k][1];
                    if(nx>=0 && nx<m && ny>=0 && ny<n 
                        && !visited[nx][ny] && rooms[nx][ny] != -1)
                    {
                        q.push({nx,ny});
                        visited[nx][ny] = true;
                    }
                }
            }
            step++;
        }
    }
};

124 ms 18.8 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
    • 2.1 BFS 超时解
      • 2.2 从门开始逆向BFS
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档