1765. 地图中的最高点

1765. 地图中的最高点

给你一个大小为 m x n 的整数矩阵 isWater ,它代表了一个由 陆地 和 水域 单元格组成的地图。
  • 如果 isWater[i][j] == 0 ,格子 (i, j) 是一个 陆地 格子。
  • 如果 isWater[i][j] == 1 ,格子 (i, j) 是一个 水域 格子。

你需要按照如下规则给每个单元格安排高度:

  • 每个格子的高度都必须是非负的。
  • 如果一个格子是 水域 ,那么它的高度必须为 0 。
  • 任意相邻的格子高度差 至多 为 1 。当两个格子在正东、南、西、北方向上相互紧挨着,就称它们为相邻的格子。(也就是说它们有一条公共边)

找到一种安排高度的方案,使得矩阵中的最高高度值 最大 。

请你返回一个大小为 m x n 的整数矩阵 height ,其中 height[i][j] 是格子 (i, j) 的高度。如果有多种解法,请返回 任意一个 。

 

示例 1:

输入:isWater = [[0,1],[0,0]]
输出:[[1,0],[2,1]]
解释:上图展示了给各个格子安排的高度。
蓝色格子是水域格,绿色格子是陆地格。

示例 2:

输入:isWater = [[0,0,1],[1,0,0],[0,0,0]]
输出:[[1,1,0],[0,1,1],[1,2,2]]
解释:所有安排方案中,最高可行高度为 2 。
任意安排方案中,只要最高高度为 2 且符合上述规则的,都为可行方案。

 

提示:

  • m == isWater.length
  • n == isWater[i].length
  • 1 <= m, n <= 1000
  • isWater[i][j] 要么是 0 ,要么是 1 。
  • 至少有 1 个水域格子。
复制代码
 1 #include <iostream>
 2 #include <queue>
 3 #include <vector>
 4 using namespace std;
 5 
 6 constexpr int g_direction[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
 7 class Solution {
 8 public:
 9     vector<vector<int>> highestPeak(vector<vector<int>>& isWater) {
10         if (isWater.size() <= 0) {
11             return {};
12         }
13         int m = isWater.size();
14         int n = isWater[0].size();
15         vector<vector<int>> ans(m, vector<int>(n, -1)); // 存储水域的高度
16         queue<std::pair<int, int>> q;
17         for (int i = 0; i < m; i++) {
18             for (int j = 0; j < n; j++) {
19                 if (isWater[i][j] == 1) {
20                     ans[i][j] = 0; // 水域的高度为0
21                     q.push(make_pair(i, j));
22                 }
23             }
24         }
25         while (!q.empty()) {
26             std::pair<int, int> now = q.front();
27             q.pop();
28             for (int i = 0; i < 4; i++) {
29                 int nextX = now.first + g_direction[i][0];
30                 int nextY = now.second + g_direction[i][1];
31                 if ((nextX >= 0 && nextX < m) && (nextY >= 0 && nextY < n) && (ans[nextX][nextY] == -1)) {
32                     q.push(make_pair(nextX, nextY));
33                     ans[nextX][nextY] = ans[now.first][now.second] + 1;
34                 }
35             }
36         }
37         return ans;
38     }
39 };
40 
41 int main()
42 {
43     Solution *test = new Solution();
44     // 初始化矩阵
45     vector<vector<int>> isWater = {{0, 0, 1}, {1, 0, 0}, {0, 0, 0}};
46     vector<vector<int>> answer(isWater);
47     answer = test->highestPeak(isWater);
48     for (int i = 0; i < 3; i++) {
49         for (int j = 0; j < 3; j++) {
50             cout << answer[i][j]<< " ";
51         }
52         cout << endl;
53     }
54     cout << endl;
55     system("pause");
56     return 0;
57 }
复制代码

运行结果:

 

 

posted @   跳动的休止符  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示