题目:
给一个01矩阵,求不同的岛屿的个数。
0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
样例在矩阵:
[
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 1],
[0, 0, 0, 1, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 1]
]
中有 3
个岛.
思想:
运用了一些递归的思想,首先是双层for循环逐个遍历矩阵的元素.
找到某个元素为1的时候,利用递归的思想将这个元素的上下左右,和它相邻的为true的上下左右元素,和相邻的相邻的.... 这些元素改为false
最后返回num
代码:
public static int numIslands(boolean[][] grid) {
// Write your code here
int num = 0;
if (grid == null)
return 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == true) {
num++;
grid = change(grid, i, j);
}
}
}
return num;
}
public static boolean[][] change(boolean[][] grid, int i, int j) {
// 修改为false
grid[i][j] = false;
if (i > 0 && grid[i - 1][j] == true) {
// 修改左边的
grid = change(grid, i - 1, j);
}
if (j < grid[i].length - 1 && grid[i][j + 1] == true) {
// 修改右边的
grid = change(grid, i, j + 1);
}
if (j > 0 && grid[i][j - 1] == true) {
// 修改上边的
grid = change(grid, i, j - 1);
}
if (i < grid.length - 1 && grid[i + 1][j] == true) {
// 修改下边的
grid = change(grid, i + 1, j);
}
return grid;
}