0
点赞
收藏
分享

微信扫一扫

Leetcod 热题100 200.岛屿数量(C++)

三千筱夜 2022-05-05 阅读 27

问题展示:

在这里插入图片描述


问题描述

这是一道与求连通块的题目很相似,文中的题目的问题也给的很明确,就是求由“1”为陆地,“0”为水,所构成的二维平面中,能形成多少给岛屿。我们可以通过搜索的方法,通过遍历题目所给的二维数组,找到有“1”的位置,然后从这个位置开始,对该位置上下左右4个方向进行,遍历,将为“1”的地方都改为“0”,这样的话,我们每搜索一次就会把一个岛屿上所有的“1”都变为“0”,那么最终搜索了几次,也就有几个岛屿!问题也就解决了。接下来我们看如何一步一步形成我们的代码。

过程分析:

①:方向的定义:我们用dy[4]与dx[4],来表示我们遍历的“上下左右”四个方向;
②:深搜函数(dfs())参数的定义:除了题目给出的二维数组外,还需要我们在遍历“1”时所找到的坐标,x与y和,二维数组的宽数与行数,n与m(这是代码块所以,要传入n与m,如果觉得太长了,也可以写在dfs()中);
③:在搜索过程中要注意我们搜索的边界不要超过n与m,这也算是我们传入n与m的作用了;
到这也说的差不多了,我们来看看具体的代码实现吧。


代码实现:

class Solution {
public:
    int dx[4]={0,1,0,-1};//x方向
    int dy[4]={1,0,-1,0};//y方向
    int numIslands(vector<vector<char>>& grid) {
        int n=grid.size();//宽数
        int m=grid[0].size();//行数
        int count=0;//用于记录岛屿数
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(grid[i][j]=='1')//搜索“1”开始的位置
                {
                    count++;
                    dfs(grid,i,j,n,m);//进行深搜
                }
            }
        }
        return count;//返回岛屿数目
    }
    void dfs(vector<vector<char>>& grid,int x,int y,int n,int m)
    {
         grid[x][y]='0';
         for(int i=0;i<4;i++)//4个方向进行搜索
         {
             int xn=x+dx[i];
             int yn=y+dy[i];
             if(xn>=0&&xn<n&&yn>=0&&yn<m&&grid[xn][yn]=='1')//注意不要超过边界
             {
                 grid[xn][yn]='0';//将“1”赋值为“0”;
                 dfs(grid,xn,yn,n,m);//继续搜索
             }
         }
    }
};

总结

到这我们今天分享的题目也就结束了,这是一道关于搜索的题目,希望看了的小伙伴有所搜获(如果觉得还不错的话,记得点赞、收藏哦,博主在这谢过啦),每日一题今天完毕,小伙们,我们明天再见!

举报

相关推荐

0 条评论