• 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 };
  • 相关阅读:
    这是一段Java程序员写给最爱的老婆的代码。
    第一次来写博客,这里可以记录很多故事。
    转 JavaScript前端和Java后端的AES加密和解密
    java webservice浏览器测试地址
    Eclipse4.5在线安装Aptana插件及配置代码提示教程
    彻底的卸载干净oracle 11g(转)
    oracle查看编码以及修改编码(转)
    关于AngularJs数据递归呈现的实现的几种方式
    ionic的ngModel指令失效
    AngularJS 自定义指令详解
  • 原文地址:https://www.cnblogs.com/nilbook/p/13789486.html
Copyright © 2020-2023  润新知