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 };

 

posted @ 2020-10-09 23:13  nilbook  阅读(146)  评论(0编辑  收藏  举报