「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
题目描述
给你一个大小为 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.
当遍历到“岸边”时,周边若存在未遍历过的区域,则将此处标记为2.
此时很多人会有疑问了,会不会出现岸边的周围也应该是岸边,但是没有被计算到过呢?
答案是不会,因为所有的岸边的周围一定有海域,也就是说当遍历到第一个岸边时,所有的海域都已经遍历过了,必然是被写入过队列中的。
总结
这道题需要对广度优先遍历有比较深入的了解,要求人灵活使用,而不是一味的套用模板。同时证明dfs正确性本身也是对学习的一次剖心烛照