LeetCode1162 地图分析
/*
* @lc app=leetcode.cn id=1162 lang=cpp
*
* [1162] 地图分析
*/
// @lc code=start
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
class Solution {
public:
/*
将问题转化:
从每个陆地区域出发,所有陆地区域每次同时向往扩散一圈,每个海洋区域被首次覆盖时所对应的圈数,
就是海洋区域距离最近的陆地区域的距离
*/
//假设存在一个虚拟源点,与每个大陆单元格的距离都是1
int maxDistance(vector<vector<int>>& grid) {
int n=grid.size();
queue<pair<int,int>> q;
vector<vector<int>> g(n,vector<int>(n,0));//虚拟源点与每个海洋单元格距离
vector<vector<int>> dirs={{1,0},{0,1},{-1,0},{0,-1}};
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1){
g[i][j]=1;//虚拟源点到每个大陆单元格的距离为1
q.emplace(i,j);
}
}
}
int res=-1;
while(!q.empty()){
auto [curx,cury]=q.front();
q.pop();
int step=g[curx][cury];
for(int i=0;i<4;i++){
int nx=curx+dirs[i][0],ny=cury+dirs[i][1];
if(nx<0||nx>=n||ny<0||ny>=n) continue;//越界
if(g[nx][ny]!=0) continue;//陆地单元格或已被覆盖的海洋单元格
g[nx][ny]=step+1;
q.emplace(nx,ny);
res=max(res,step+1);
}
}
if(res==-1) return -1;
return res-1;
}
};