总结:
1.根据题意可知,每找到一个连通分量就是一个岛屿。所以可以使用循环访问所有的点,每找到一个未被访问且值为1的点就是一个连通分量,岛屿数就加1.找到一个岛屿后就使用深度优先搜索把岛上所有的点遍历一遍,标记为已访问。
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
boolean[][] visited;
public int solve (char[][] grid) {
// write code here
int rowNum = grid.length;
int colNum = grid[0].length;
visited = new boolean[rowNum][colNum];
int num = 0;//岛屿数量
for(int i=0;i<rowNum;i++)
for(int j=0;j<colNum;j++){
if((!visited[i][j])&&grid[i][j]=='1'){
dfs(grid,i,j,rowNum,colNum);
num++;
}
}
return num;
}
public void dfs(char[][] grid,int i,int j,int rowNum,int colNum){
visited[i][j]=true;
if(j-1>=0 && grid[i][j-1]=='1'&&(!visited[i][j-1]))
dfs(grid,i,j-1,rowNum,colNum);//向左找
if(j+1<colNum && grid[i][j+1]=='1'&&(!visited[i][j+1]))
dfs(grid,i,j+1,rowNum,colNum);//向右找
if(i-1>=0 && grid[i-1][j]=='1'&&(!visited[i-1][j]))
dfs(grid,i-1,j,rowNum,colNum);//向下找
if(i+1<rowNum && grid[i+1][j]=='1'&&(!visited[i+1][j]))
dfs(grid,i+1,j,rowNum,colNum);//向下找
}
}
京公网安备 11010502036488号