Leetcode1162: 地图分析

2020-09-23  本文已影响0人  VIELAMI

你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

如果网格上只有陆地或者海洋,请返回 -1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/as-far-from-land-as-possible
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

#BFS
#图

从陆地块开始逐渐向海洋延伸,最后一个到达的海洋就是离陆地最远的海洋

class Solution {
public:
    vector<int> dx = {0,0,1,-1};
    vector<int> dy = {1,-1,0,0};
  //代表了方向的向量,对一个块进行上下左右的搜索
    int maxDistance(vector<vector<int>>& grid) {
            vector<vector<int>> record(grid.size(),vector<int>(grid[0].size(),0));
        queue<pair<int,int>> nodeQueue;
    
    //把陆地加入queue
    for(int i = 0; i < grid.size();i++){
        for(int j = 0; j < grid[i].size();j++){
            if(grid[i][j] == 1){
                nodeQueue.push(pair<int,int>(i,j));
            }
        }
    }
    
    pair<int,int> node = {0,0};

//    
    while(!nodeQueue.empty()){
        int size = nodeQueue.size();
        for(int i = 0; i < size;i++){
            node = nodeQueue.front();nodeQueue.pop();
            int x = node.first;
            int y = node.second;
            for(int k = 0; k < 4;k++){
                int newX = x + dx[k];
                int newY = y + dy[k];
                if(newX < 0 || newX >= grid.size()|| newY < 0||newY >= grid[0].size()||record[newX][newY] != 0 || grid[newX][newY] != 0) continue;
//判断越界,是否visit过,以及是否是海洋
                record[newX][newY] = record[x][y] + 1;
                nodeQueue.push(pair<int,int>(newX,newY));
            }
            
        }
    }
    
    if(record[node.first][node.second] == 0) return -1;
    else return record[node.first][node.second];

    }
};

注意 图中的BFS要有一个记录有无visit过的数据结构

上一篇下一篇

猜你喜欢

热点阅读