题目链接:
https://leetcode-cn.com/problems/number-of-islands/
问题描述:
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:
输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
代码实现:
class Solution {
char[][] g;
public int numIslands(char[][] grid) {
int island = 0;
g = grid;
for(int i = 0; i < grid.length;i++){
for(int j = 0; j < grid[i].length;j++){
island += sink(i,j);
}
}
return island;
}
int[] dx = new int[]{-1,1,0,0};
int[] dy = new int[]{0,0,-1,1};
public int sink(int i,int j){
if(g[i][j]=='0'){
return 0;
}
g[i][j] = '0';
for(int k = 0; k < dx.length; k++){
int x = i+dx[k],y = j+dy[k];
if(x >= 0 && x<g.length && y>=0 && y<g[i].length){
sink(x,y);
}
}
return 1;
}
}
解题思路:
对于连接在一起的1我们认定其为一个岛屿,因此我们可以使用深度优先搜索的思路解决本问题,我们顺序遍历二维数组,当遍历到1时以此为根节点进行深度优先遍历搜索,对于搜索到的1我们做一下标记将其值变为0,直到遍历完所有的相连接的所有为1的节点,然后遍历下一个独立为1 的节点,每开始一次深度优先搜索我们就认为找到一个岛屿。