其他分享
首页 > 其他分享> > 1162. 地图分析(dijkstral+多源BFS)

1162. 地图分析(dijkstral+多源BFS)

作者:互联网

1162. 地图分析

你现在手里有一份大小为 n x n 的 网格 grid,上面的每个 单元格 都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地。

请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的,并返回该距离。如果网格上只有陆地或者海洋,请返回 -1

我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

 

示例 1:

输入:grid = [[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释: 
海洋单元格 (1, 1) 和所有陆地单元格之间的距离都达到最大,最大距离为 2。

示例 2:

输入:grid = [[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释: 
海洋单元格 (2, 2) 和所有陆地单元格之间的距离都达到最大,最大距离为 4。

 

提示:

 

 1 class Solution {
 2 public:
 3     static constexpr int INF = 0x3F3F3F3F;
 4     static constexpr int MAX_NUM = (100 +10);
 5     vector<vector<int>> g_direction = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // 上、右、下、左四个方向
 6     bool isInArea(int n, int x, int y) {
 7         return (x >= 0 && x < n && y >= 0 && y < n);
 8     }
 9     int maxDistance(vector<vector<int>>& grid) {
10         vector<vector<int>> dis(MAX_NUM, vector<int>(MAX_NUM, INF)); // 初始化起点到各定点的距离为无穷大
11         int n = grid.size();
12         queue<std::pair<int, int>> q;
13         for (int i = 0; i < n; i++) {
14             for (int j = 0; j < n; j++) {
15                 if (grid[i][j] == 0) {
16                     continue;
17                 }
18                 dis[i][j] = 0; // 将所有值为1(陆地)的点作为起始点
19                 q.push(make_pair(i, j));
20             }
21         }
22         while (!q.empty()) {
23             int curX = q.front().first;
24             int curY = q.front().second;
25             q.pop();
26             for (auto &dir : g_direction) {
27                 int nextX = curX + dir[0];
28                 int nextY = curY + dir[1];
29                 if (!isInArea(n, nextX, nextY)) {
30                     continue;
31                 }
32                 // 更新起始点到四个方向的最短路径
33                 if (dis[nextX][nextY] > dis[curX][curY] + 1 ) {
34                     dis[nextX][nextY] = dis[curX][curY] + 1;
35                     q.push(make_pair(nextX, nextY));
36                 }
37             }
38         }
39         int ans = -1; // 默认无最大路径(全是陆地或全是海洋)
40         // 遍历图中所有点找到最大路径
41         for (int i = 0; i < n; i++) {
42             for (int j = 0; j < n; j++) {
43                 if (grid[i][j] != 0) {
44                     continue;
45                 }
46                 ans = max(ans, dis[i][j]);
47             }
48         }
49         return (ans == INF) ? -1 : ans;
50     }
51 };

标签:BFS,单元格,int,dijkstral,距离,地图分析,grid,nextX,dis
来源: https://www.cnblogs.com/MGFangel/p/16290709.html