给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
读题: 1是陆地,0是水,1只有上下左右四个方向有1才能连接
思路: 广度优先搜索,递归 双层for循环找到第一块陆地,陆地数加1,然后搜索陆地上下左右四个方向,搜索到水停止,搜索到边界停止,为了避免重复搜索,将搜索过的陆地标记为’0’,可以理解为在指定区域搜索陆地,找到一块陆地计数1,然后将该陆地击沉到海底,然后继续寻找其他陆地
以下是代码:
class Solution {
public int numIslands(char[][] grid) {
//初始化岛屿数量
int island = 0;
// 如果二维数组为空,则返回0
if (grid.length==0){
return 0;
}
// 以二维数组长度为行数,第一个数组长度为列数,开始广度遍历,为了避免重复遍历,已经遍历的赋值为0
int rows = grid.length;
int cols = grid[0].length;
//找到第一块陆地,然后四个方向探索
for (int i=0; i<rows ;i++){
for (int j=0;j < cols;j++){
// 找到陆地,岛屿数加1,开始探索
if (grid[i][j]== '1'){
island++;
searchLand(grid,i,j,rows,cols);
}
}
}
return island;
}
public void searchLand(char[][] grid,int i,int j,int rows,int cols){
//探索出界
if (i<0 || i>=rows || j<0 || j>=cols){
return;
}
//周围都是水
if (grid[i][j] != '1'){
return;
}
//标记探索地区
grid[i][j] = '0';
//探索上
searchLand(grid,i-1,j,rows,cols);
//探索下
searchLand(grid,i+1,j,rows,cols);
//探索左
searchLand(grid,i,j-1,rows,cols);
//探索右
searchLand(grid,i,j+1,rows,cols);
}
}