1162. 地图分析

在这里插入图片描述
在这里插入图片描述
解法:bfs

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        if (grid.empty())	return 0;
		int rows = grid.size(),cols = grid[0].size();
		vector<vector<int>> dist(rows, vector<int>(cols));  //距离矩阵
        vector<vector<int>> seen(rows, vector<int>(cols));  //访问标记矩阵
        int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };	//方向数组
		queue<pair<int,int>> q;
		for (int i = 0; i < rows; i++)	//将所有的 1 的位置放入队列
		   for (int j = 0; j < cols; j++)
		       if (grid[i][j] == 1) {
		           seen[i][j] = 1;   //标记为访问过
		           q.push({ i, j }); 
		       }
        if(q.size()==rows*cols || q.empty())    //全是岛屿或海洋,返回-1
            return -1;		
        while (!q.empty()) {
		   pair<int,int> cur=q.front();
		   q.pop();
		   for (int i = 0; i < 4; i++) {	//以每个1为中心向四个方向搜索
		       int nx=cur.first+dir[i][0], ny=cur.second+dir[i][1];
		       if (nx>=0 && ny>=0 && nx<rows && ny<cols && !seen[nx][ny]){	//未访问位置
		            dist[nx][ny] = dist[cur.first][cur.second]+1;   //更新距离
		            q.push({nx,ny});
                    seen[nx][ny]=1; //标记为访问过
		       }
		   }
		}
        int res=0;	//遍历距离矩阵寻找最长距离
		for (int i = 0; i < rows; i++)	
		   for (int j = 0; j < cols; j++){
               if(dist[i][j]>res)
                    res=dist[i][j];
           }
        return res;
    }
};

优化
直接在原矩阵上修改,未访问点设置标记位-1,陆地原点的距离改为0。设置变量,记录访问的深度。

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        if (grid.empty())	return 0;
		int rows = grid.size(),cols = grid[0].size();
        int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };	//方向数组
		queue<pair<int,int>> q;
		for (int i = 0; i < rows; i++)	//将所有的 1 的位置放入队列
		   for (int j = 0; j < cols; j++)
		       if (grid[i][j] == 1){
                   q.push({i,j});
                   grid[i][j]=0;    //陆地原点的距离为0
               }     
               else
                    grid[i][j]=-1;  //标记为未访问
        if(q.size()==rows*cols || q.empty())    //全是岛屿或海洋,返回-1
            return -1;
        int level=-1;	//访问最大深度
        while (!q.empty()) {
           level++; 
           int size=q.size();
           for(int i=0;i<size;i++){
                pair<int,int> cur=q.front();
		        q.pop();
                for (int i = 0; i < 4; i++) {	//以每个1为中心向四个方向搜索
                    int nx=cur.first+dir[i][0], ny=cur.second+dir[i][1];
                    if (nx>=0 && ny>=0 && nx<rows && ny<cols && grid[nx][ny]==-1){//未访问位置
                        grid[nx][ny] = grid[cur.first][cur.second]+1;
                        q.push({nx,ny});
                    }
                }
           } 
		}
        return level;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值