题目
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
示例1
输入:
[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
返回值:
3
利用深度优先遍历把所有的相连的1标记被访问过,遍历二维数组每次遇到1且是没有访问过的,那么次数加一并进行深度优先遍历。
public int count = 0;
public int solve (char[][] grid) {
// write code here
int rowLen = grid.length;
int colLen = grid[0].length;
boolean[][] visited = new boolean[rowLen][colLen];
for(int i = 0; i < rowLen; i++) {
for(int j = 0; j < colLen; j++) {
//如果元素为1且未被访问过,表示这是一个新的岛屿,因为从1开始访问其相连的1都会被访问
if(grid[i][j] == '1' && visited[i][j] == false) {
count++;
dfs(grid,i,j,visited);
}
}
}
return count;
}
public void dfs(char[][] grid,int row,int col,boolean[][] visited) {
int rowLen = grid.length;
int colLen = grid[0].length;
//超过下边界
if(row >= rowLen) {
return;
}
//超过右边界
if(col >= colLen) {
return;
}
//超过上边界
if(row < 0) {
return;
}
//超过左边界
if(col < 0) {
return;
}
//如果当前节点被访问过
if(visited[row][col] == true) {
return;
}
if(grid[row][col] == '0') {
return;
}
//访问当前节点
visited[row][col] = true;
//向左访问
dfs(grid,row,col-1,visited);
//向*问
dfs(grid,row-1,col,visited);
//向右访问
dfs(grid,row,col+1,visited);
//向下访问
dfs(grid,row + 1,col,visited);
}