题目描述:
该题是leetcode的中等题,首先想到的是搜索,深度优先搜索和广度优先搜索都行。这里用的是深搜。思路:创建一个二维数组来标记是否已经搜过,遍历原始数组,如果是陆地’1’且没有被搜过,就开始深搜;深搜完后,岛屿数量加1即可。
代码如下:
class Solution {
//表示深度搜索的上下左右四个方向
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public int numIslands(char[][] grid) {
if(grid.length <= 0 || grid[0].length <= 0){
return 0; //如果是[],直接返回0
}
int island_num = 0; //小岛数量
int row = grid.length; //行数
int col = grid[0].length; //列数
boolean[][] flag = new boolean[row][col]; //标记是否搜过
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
flag[i][j] = false; //初始化为false
}
}
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
if(flag[i][j] == false && grid[i][j] == '1'){ //如果是陆地并且没有被搜过, 开始深度搜索
dfs(flag, grid, i, j, row, col);
island_num++; //深度搜索完一遍,小岛数量加1
}
}
}
return island_num;
}
//深搜的代码
public static void dfs(boolean[][] flag, char[][] grid, int x, int y, int row, int col){
flag[x][y] = true;
for(int i = 0; i < 4; i++){ //从上下左右四个方向深搜
int newX = x + dx[i];
int newY = y + dy[i];
if(newX < 0 || newX >= row || newY < 0 || newY >= col){
continue; //越界跳过不搜
}
if(flag[newX][newY] == false && grid[newX][newY] == '1'){
dfs(flag, grid, newX, newY, row, col);
}
}
}
}