题目:
给你一个大小为 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) 的高度。如果有多种解法,请返回 任意一个 。
算法:
方法一:多源BFS
从水域开始BFS,遍历到的位置高度+1,已经遍历过的位置则跳过。这样可以保证陆地高度最高。每个陆地的高度由它距离最近的水域的距离决定。
func highestPeak(isWater [][]int) [][]int {
n := len(isWater)
m := len(isWater[0])
queue := make([][]int, 0)
for i := 0 ; i < n; i ++ {
for j := 0; j < m; j ++ {
if isWater[i][j] == 0 {
isWater[i][j] = -1
} else {
queue = append(queue, []int{i, j})
isWater[i][j] = 0
}
}
}
dircts := [][]int{[]int{-1, 0},[]int{1, 0},[]int{0, -1},[]int{0, 1}}
for len(queue) != 0 {
item := queue[0]
queue = queue[1:]
for _, dirt := range dircts {
x, y := item[0] + dirt[0], item[1] + dirt[1]
if 0 <= x && x < n && 0 <= y && y < m {
//bfs遍历过了
if isWater[x][y] != -1 {
continue
}
isWater[x][y] = isWater[item[0]][item[1]] + 1
queue = append(queue, []int{x, y})
}
}
}
return isWater
}