题目
你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。
示例
输入:
[
[0,2,1,0],
[0,1,0,1],
[1,1,0,1],
[0,1,0,1]
]
输出: [1,2,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pond-sizes-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1:BFS
Java实现
class Solution {
int row, col;
//8个方向:上、下、左、右、左上、左下、右上、右下
int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
List<Integer> res = new ArrayList<>();
public int[] pondSizes(int[][] land) {
row = land.length;
col = land[0].length;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (land[i][j] == 0) {
res.add(track_back(land, i, j));
}
}
}
int[] out = new int[res.size()];
for (int i = 0; i < res.size(); i++) out[i] = res.get(i);
Arrays.sort(out);
return out;
}
public int track_back(int[][] land, int ii, int jj) {
int sum = 0;
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{ii, jj});
while (!q.isEmpty()) {
int sz = q.size();
for (int i = 0; i < sz; i++) {
int[] cur = q.poll();
sum++;
land[cur[0]][cur[1]] = 1;
for (int j = 0; j < directions.length; j++) {
int x = cur[0] + directions[j][0];
int y = cur[1] + directions[j][1];
if (x >= row || x < 0 || y >= col || y < 0 || land[x][y] != 0) continue;
q.offer(new int[]{x, y});
land[x][y] = 1;
}
}
}
return sum;
}
}