题目
1765.地图中的最高点
题目大意
给你一个大小为 m x n
的整数矩阵 isWater
,它代表了一个由 陆地 和 水域 单元格组成的地图。
- 如果
isWater[i][j] == 0
,格子(i, j)
是一个 陆地 格子。 - 如果
isWater[i][j] == 1
,格子(i, j)
是一个 水域 格子。
你需要按照如下规则给每个单元格安排高度:
- 每个格子的高度都必须是非负的。
- 如果一个格子是是 水域 ,那么它的高度必须为
0
。 - 任意相邻的格子高度差 至多 为
1
。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)
找到一种安排高度的方案,使得矩阵中的最高高度值 最大 。
请你返回一个大小为 m x n
的整数矩阵 height
,其中 height[i][j]
是格子 (i, j)
的高度。如果有多种解法,请返回 任意一个 。
样例
数据规模
思路
考虑到 水域 格子的高度肯定是 0 0 0,那么周围的格子一定是由最近的 水域 格子来决定,所以可以考虑使用多源BFS来实现。所有的 h [ i ] [ j ] h[i][j] h[i][j]初始化为无穷大,对于所有的 水域 格子,它们的 h [ i ] [ j ] = 0 h[i][j]=0 h[i][j]=0,并且加入队列中,然后进行 b f s bfs bfs。对于队列中的每一个节点,考虑它的四周,如果 h [ i ] [ j ] h[i][j] h[i][j]仍然无穷大,说明该点没有访问过,那么该点 h [ n e x ] [ n e y ] = h [ x ] [ y ] + 1 h[nex][ney]=h[x][y]+1 h[nex][ney]=h[x][y]+1。最后所有的点都访问过之后,最优方案也就确定了,最后将答案储存到 a n s ans ans中。
代码
class Solution {
public:
int h[1000+50][1000+50];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
int n=isWater.size(),m=isWater[0].size();
memset(h,0x3f3f3f3f,sizeof(h));
queue<pair<int,int>>q;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(isWater[i][j]==1){
h[i][j]=0;
q.push(make_pair(i,j));
}
}
}
vector<vector<int>> ans;
while(!q.empty()){
pair<int,int> x=q.front();q.pop();
for(int i=0;i<4;i++){
int nex=x.first+dx[i],ney=x.second+dy[i];
if(nex>=0&&nex<n&&ney>=0&&ney<m){
if(h[nex][ney]!=0x3f3f3f3f)continue;
h[nex][ney]=h[x.first][x.second]+1;
q.push(make_pair(nex,ney));
}
}
}
for(int i=0;i<n;i++){
vector<int>a;
for(int j=0;j<m;j++){
a.push_back(h[i][j]);
}
ans.push_back(a);
}
return ans;
}
};