0
点赞
收藏
分享

微信扫一扫

力扣1765——地图中的最高点(多源BFS)

RJ_Hwang 2022-01-31 阅读 27

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

最高的地方,也就是该点离水域最近的曼哈顿距离,可以从水域开始不断往上涨高度;
首先记录水域,从岸边开始多个水域同步往上涨,并记录已访问节点,保证满足高度差要求,最后矩阵合法且有最高高度,因为每步在能涨的时候都涨了

代码

class Solution {
public:
    int seed = 13131;
    vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
        vector<pair<int, int>> dir = {{0,1}, {0,-1}, {1,0}, {-1,0}};
        int m = isWater.size(), n = isWater[0].size();
        vector<vector<int>> ans = isWater;
        vector<vector<int>> vis = isWater;  //标记访问,正好水域是1已访问
        queue<pair<int, int>> q;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                ans[i][j] = isWater[i][j] ? 0 : 1;
                if(isWater[i][j] == 1) q.push({i * seed + j, 0});
            }
        }
        while(!q.empty()) {
            auto [pos, heigt] = q.front();
            q.pop();
            int x = pos / seed, y = pos % seed;
            for(auto [dx, dy] : dir) {
                int nx = x + dx, ny = y + dy;
                if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx][ny]) continue;
                ans[nx][ny] = heigt + 1;
                vis[nx][ny] = 1;
                q.push({nx * seed + ny, heigt + 1});
            }
        }
        return ans;
    }
};
举报

相关推荐

0 条评论