给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
中等难度。使用图的DFS深度优先遍历即可解决。对于找到的某个值为‘1’的点位,记为1个岛屿,然后从当前位置开始,向四周扩散的继续查找该岛屿的范围,同时需要把找到‘1’的位置标记为‘2’,防止重复遍历。
实际上只要有了思路,那么代码很容易看懂!
public int numIslands( char[][] grid ){
//岛屿计数器
int islandNum = 0;
for( int i = 0; i < grid.length; i++ ){
for( int j = 0; j < grid[ i ].length; j++ ){
if( grid[ i ][ j ] == '1' ){
//从当前点开始向四周扩散查找‘1’,并且标记为‘2’
//也就是标记当前岛屿的范围
mark( grid, i, j );
//当前岛屿的范围查找和标记完毕,岛屿数量加一
islandNum++;
}
}
}
return islandNum;
}
private void mark( char[][] grid, int i, int j ){
//如果二位数组查找i、j越界,或者当前值不等于‘1’,说明当前点位属于当前岛屿的边界部分,直接返回
if( i < 0 || i > grid.length - 1 || j < 0 || j > grid[ 0 ].length - 1 || grid[ i ][ j ] != '1' ){
return;
}
//如果当前值是‘1’,那么标记当前位置
grid[ i ][ j ] = '2';
//从当前位置,向四周(上下左右)扩散查找
mark( grid, i - 1, j );
mark( grid, i + 1, j );
mark( grid, i, j - 1 );
mark( grid, i, j + 1 );
}