题目
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围, 并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
思路
思路来源:https://blog.youkuaiyun.com/lv1224/article/details/82470100
DFS 算法
感谢大佬~!
大致说明下:
第一步 将 第一个 值为1 的点 及其周围 为 1 的点 的值都置为 2
这代表 该 岛屿 个所有节点 都被遍历 过了
第二步 遍历整个二维数组即可 ,注意 每做完一次 第一步 都代表已经遍历过了 一整个岛屿
解答(加入计算最大岛屿数目的实现)
/**
*
*/
/***
* @author 18071
* @Date 2019年3月6日
* letcode 200
* 功能:给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,
* 计算岛屿的数量。一个岛被水包围,
* 并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
***/
public class test {
public static void main(String args []) {
Solution s=new Solution ();
int [][] x = {{1,1,1,0 },{1,1,0,1},{0,0,1,1 },{1,1,0,0}};
System.out.println(s.numIslands(x));
}
}
class Solution {
public int setone(int [][] grid ,int row ,int colum) {
if(row >= grid.length||colum>= grid[0].length|| row < 0|| colum <0 || grid[row][colum]!=1) {
return 0 ;
}
else {
System.out.println("i is "+ row+" j is "+colum);
grid[row][colum]=2;//表示已经遍历过该点,并且判断 与该点相邻的个点,最后将会该岛所有点都设置为 2
return 1+
setone(grid,row-1,colum)+
setone(grid,row+1,colum)+
setone(grid,row,colum-1)+
setone(grid,row,colum+1);
}
}
public int numIslands(int[][] grid) {
//遍历整个二位数组就可以了
int rowmax = grid.length;
System.out.println("rowmax is "+ rowmax );
int colunmmax =grid[0].length;
int sum=0;//统计当前岛屿个数
int max =0;
for(int i=0;i<rowmax;i++) {
for(int j=0;j<colunmmax;j++) {
if(grid[i][j]==1) {
//System.out.println("i is "+ i+" j is "+j);
int temp=setone(grid,i,j);
if(temp>max) {
max = temp;
}
sum++;
}
}
System.out.println("最大岛屿数量为 ::" +max);
}
return sum;
}
}