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。
提示:
n == grid.length
n == grid[i].length
1 <= n <= 100
grid[i][j]
不是0
就是1
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