地图分析
题目
你现在手里有一份大小为 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;
    }
};
题外话
小宋老师翘尾巴说:看,很多人写这道题时都觉得时普通bfs,但聪明的人一下子就想到了它是最短路!
某Acmer小情侣聊天记录be like


                
            
        
浙公网安备 33010602011771号