题目:
给你一个由 '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