地图分析
题目
你现在手里有一份大小为 N x N 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。
我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。
如果网格上只有陆地或者海洋,请返回 -1。
题解
可以参考非常详细讲解的小宋聊天记录。
先放这里,因为我也没完全理解QAQ。
class Solution {
public:
struct H{
int to,d;
H(int to,int d){this->to=to;this->d=d;}
};
vector<H> v[10005];
void add(int a,int b){
v[a].push_back(H(b,1));
v[b].push_back(H(a,1));
}
int maxDistance(vector<vector<int>>& grid) {
//最短路做法
int n=grid.size();
int s=10001,t=10002;//超级源点和超级汇点
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(grid[i][j]) v[s].push_back(H(i*n+j,0));
else v[i*n+j].push_back(H(t,0));
if(j+1<n) add(i*n+j,i*n+j+1);
if(i+1<n) add((i+1)*n+j,i*n+j);
}
}
queue<int> q;
int dis[10005]={},ans=-1;
bool vis[10005]={};
memset(dis,127,sizeof(dis));//初始化到最大值
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();vis[now]=0;
for(auto x:v[now]){
if(x.to==t) ans=max(ans,dis[now]);
else if(dis[now]+x.d<dis[x.to]){
dis[x.to]=dis[now]+x.d;
if(!vis[x.to]){
q.push(x.to);
vis[x.to]=1;
}
}
}
}
return ans;
}
};

浙公网安备 33010602011771号