问题展示:
问题描述
这是一道与求连通块的题目很相似,文中的题目的问题也给的很明确,就是求由“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);//继续搜索
}
}
}
};
总结
到这我们今天分享的题目也就结束了,这是一道关于搜索的题目,希望看了的小伙伴有所搜获(如果觉得还不错的话,记得点赞、收藏哦,博主在这谢过啦),每日一题今天完毕,小伙们,我们明天再见!