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