zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    51Nod1136--欧拉函数
    ubuntu裸机镜像问题
    汉诺塔问题
    lwm2m协议
    WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
    图解大顶堆的构建、排序过程
    WindowsService开发简单入门
    数据结构和算法参考网址
    c#创建windows服务入门教程实例
    C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)
  • 原文地址:https://www.cnblogs.com/nilbook/p/13789486.html
Copyright © 2011-2022 走看看