做题笔记:[LeetCode 1162. 地图分析

LeetCode 1162. 地图分析 做题笔记

思路:

对于这道题,我第一反应是用 bfs 暴力搜(在TLE的边缘试探),看了一下官方的题解,基于变种的 dijkstra 来做的思路挺好的,就记录一下自己的实现过程。

题目需要求海洋中到陆地的最远距离(距离的定义是海洋到最近陆地的距离,看题吧我也就这么解释了), dijkstra 可用来求单源最短路径。

我们以所有陆地作为源点,利用 dijkstra 去更新各个海洋到源点的距离,当更新结束时,我们便得到了各个海洋到最近的陆地的距离,我们从这些距离中找到最大的距离即可。

注意:dijkstra 的距离在初始化时设为 INF ,故在最后输出时还需要判断最大距离是否为 INF,若为则说明全是海洋,输出 -1 。

代码实现

#define INF 0x3f3f3f3f

struct pos{
    int x, y, cost;
    bool operator<(const pos &b) const {
        return cost > b.cost;
    }
};

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int row = grid.size();
        if(row == 0)
            return -1;
        int col = grid[0].size();

        int dist[row][col];
        memset(dist, INF, sizeof(dist));

        priority_queue<pos> que;
        for(int i = 0; i < row; ++i) {
            for(int j = 0; j < col; ++j) {
                if(grid[i][j] == 1) {
                    // 将所有陆地设为原点
                    dist[i][j] = 0;
                    que.push({i, j, 0});
                }
            }
        }

        while(!que.empty()) {
            pos p = que.top();
            que.pop();

            if(p.cost > dist[p.x][p.y])
                continue;

            for(int i = 0; i < 4; ++i) {
                int x = p.x + op[i][0], y = p.y + op[i][1];

                if(0 <= x && x < row && 0 <= y && y < col) {
                    if(dist[x][y] > p.cost + 1) {
                        dist[x][y] = p.cost + 1;
                        que.push({x, y, dist[x][y]});
                    }
                } 
            }
        }

        int ans = -1;
        for(int i = 0; i < row; ++i) {
            for(int j = 0; j < col; ++j) {
                if(grid[i][j] == 0)
                    ans = max(ans, dist[i][j]);
            }
        }

        return ans == INF ? -1 : ans;
    }

private:
    const int op[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
};

posted on 2020-03-30 17:49  joe11111  阅读(224)  评论(0编辑  收藏  举报

导航