DFS例题:力扣200:岛屿数量
本题利用dfs将一整座岛屿找出来,所以我们每在首函数里调用一次dfs函数,就是一座新岛屿,岛屿数量加1
在dfs函数里运用“感染”一词来寻找相连的区域
1 class Solution { 2 public: 3 int ans=0; 4 int numIslands(vector<vector<char>>& grid) { 5 if(grid.size()==0) 6 return 0; 7 for(int i=0;i<grid.size();i++){ 8 for(int j=0;j<grid[0].size();j++){ 9 if(grid[i][j]=='1'){ 10 /* 这是将一座岛屿的所有的1找到,下次循环到if这来时,已经是一座新岛屿 ,每进行一次dfs,则是一座新岛屿,则ans++ 11 最终岛屿的个数就是我们进行深搜dfs的次数*/ 12 dfs(grid,i,j); 13 ans++; 14 } 15 } 16 } 17 return ans; 18 } 19 /* 重点在于 出口是? 20 出口应该是:岛屿遍历完了,外面都是水,ans+1 但是怎么确定每个岛屿的所有外围都是水(即岛屿边际)? 21 应该是要记录每个1之前的1的位置,这样才能将一个点的四个方向分别判断是否是水域,若除了来源点,其他都是0,则是岛屿边际 22 看了题解,想多了也想错了,我们利用dfs来寻找一个点的其他感染相连的部分,从而找出一整座岛屿 23 “感染”函数infect也就是dfs函数 24 */ 25 /* 这里dfs的作用就是将一座岛屿完整的找出来,从而将水域和岛屿分开来 26 */ 27 void dfs(vector<vector<char>>& grid,int i,int j){ 28 if(i<0||j<0||i>=grid.size()||j>=grid[0].size()||grid[i][j]!='1') 29 return ; 30 grid[i][j]='0';//将遍历过的1改为其他不是1的任何字符都行,为了防止重复叠加 31 //下面的dfs是寻找感染相连区域: 32 dfs(grid,i+1,j); 33 dfs(grid,i-1,j); 34 dfs(grid,i,j+1); 35 dfs(grid,i,j-1); 36 return ; 37 } 38 };