题目:
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
示例1:
输入:
11110
11010
11000
00000
输出: 1
示例2:
输入:
11000
11000
00100
00011
输出:3
解释:每座岛屿只能由水平和/或竖直方向上相邻的陆地链接而成。
自己对题目的分析和理解:
该题求是所有岛屿的数量看似是求最小值,实际上仍然是当遍历到某一个岛屿时,求出包含它的最大区域,使得区域内全是相连的岛屿。求给的二维网格图中,连通分量的总数,那么就依次遍历二维数组中的每一个点,凡是值为1且未被访问过的点,都进行依次深度优先遍历,求出这个点对应的连通分量,然后将这个分量中的点都设置为已被访问,然后岛屿数量加一,继续进行遍历。直到所有的点都遍历完全,最后就可以求出总的岛屿数量。
总结:遍历网格中的所有点,如果值为1,则岛屿数量+1,进行深度优先搜索。
最后奉上DFS代码(参考):
class Solution {
public:
int ans=0;
int numIslands(vector<vector<char>>& grid) {
if(grid.size()==0)
return 0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
dfs(grid,i,j);
ans++;
}
}
}
return ans;
}
void dfs(vector<vector<char>>& grid,int i,int j){
if(i<0||j<0||i>=grid.size()||j>=grid[0].size()||grid[i][j]!='1')
return ;
grid[i][j]='0';
dfs(grid,i+1,j);
dfs(grid,i-1,j);
dfs(grid,i,j+1);
dfs(grid,i,j-1);
return ;
}
};
数媒202潘zy
本文解析了一个关于计算二维格子里岛屿数量的问题,利用深度优先搜索策略,通过遍历并标记连通区域来找出所有独立的陆地区域。通过实例和代码实现展示了如何解决此问题,适用于计算机科学和图形算法的学习者。
662

被折叠的 条评论
为什么被折叠?



