题目描述
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例 1:
输入:grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出:6
解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。
示例 2:
输入:grid = [[0,0,0,0,0,0,0,0]]
输出:0
解题思路
方法一:深度优先遍历
本题可以用深度优先搜索DFS求解。
我们找到一个单元格后,即找到一个岛屿。就再去其上下左右找下一个单元格,当找到单元格,再递归去找其上下左右,按此逻辑,就像拔地瓜藤一样,一下子把所有地瓜都拔出来。而这就是深度优先搜索,即dfs。
为了避免重复统计,我们将统计过的单元格位置的值从1变为0。
用ans统计每个岛屿包含的单元格个数,每找到一个岛屿包含的单元格个数大于当前岛屿,则更新ans。
int dfs(int** grid,int i,int j,int row,int col){
if(i<0||j<0||i>=row||j>=col||grid[i][j]==0)
return 0;
grid[i][j]=0;
return 1+dfs(grid,i-1,j,row,col)+dfs(grid,i+1,j,row,col)+dfs(grid,i,j-1,row,col)+