思路:
这是一个深度优先搜索的递归的过程。我们建立另一个和网格同样大小的数组 searched 来记录每一个元素是否被访问过。这个数组初始化默认是全0。设立一个sum变量,初始化为0。
我们遍历网格的每一个元素,对每一个元素,如果它是陆地,且没有被访问过,我们先将sum+1 ,然后将它所在的岛屿全部访问一遍。于此同时,将这个岛屿的searched 对应位置置为1,表示该岛屿已经访问过。
最后返回sum,即为岛屿的总数量。
对某个元素延申访问它所在的岛屿分为以下几个步骤:
- 判断该元素是否被访问过,如果是,直接return
- 如果它不在左边缘访问它左边的元素(递归)
- 如果它不在右边缘访问它左边的元素(递归)
- 如果它不在下边缘访问它下边的元素(递归)
- 如果它不在上边缘访问它上边的元素(递归)
class Solution {
public int spread(char[][] grid, int[][] searched, int i, int j)
{
if(searched[i][j]!=0||grid[i][j]=='0')
return 0;
searched[i][j] = 1;
if(i>0)
spread(grid,searched,i-1,j);
if(i<grid.length-1)
spread(grid,searched,i+1,j);
if(j>0)
spread(grid,searched,i,j-1);
if(j<grid[0].length-1)
spread(grid,searched,i,j+1);
return 1;
}
public int numIslands(char[][] grid) {
int sum = 0;
int[][] searched = new int[grid.length][grid[0].length];
for(int i=0;i<grid.length;i++)
{
for(int j=0;j<grid[0].length;j++)
{
sum += spread(grid,searched,i,j);
}
}
return sum;
}
}