dfs即深度优先搜索,正如名字所说,其是一种搜索方式,按照深度进行逐个搜索,dfs常用于回溯算法中,两者十分相似,只是,回溯法是实现方法,深度优先搜索是实现方式,同时在树的相关搜索中也会出现深度优先搜索方式,基本思想和回溯算法类似,不过有个最大不同点是回溯法需要在有回溯过程,而dfs不需要回溯,其只需向着满足条件大方向搜索,直到不满足条件为止。这里不再详细讲解算法的定义等理解性的东西,而是通过分析几个例题,得出解这类题目的模板。
岛屿数量
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
输入:
11110
11010
11000
00000
输出: 1
输入:
11000
11000
00100
00011
输出: 3
很明显该题是搜索类的问题,而且不需要把每一项都枚举出来,因此可考虑dfs,特别是矩阵类的dfs,套路很固定,首先,需要定义四个方向,即每个位置的上下左右,对每个方向都进行判断是否满足继续向下搜索的条件,如果满足,那么就调用dfs递归函数进行递归调用,同时在进行每个方向选择时需要注意下个位置是否已经遍历过,因此,一般会需要一个额外的数组来存储某个位置是否已经被调用过,不过这道题显然可以不是使用额外数组,直接在原数组上将遍历过的数据置为0即可为了统计数量,需要在遍历开始时,对岛屿数量加一,代表这次遍历会经过属于该块岛屿的所有块,看懂解题思想后代码就很好实现了。
class Solution {
private:
//定义四个方向,上下左右,方向的顺序排列没有影响
vector<vector<int>>dir={
{
1,0},{
-1,0},{
0,1},{
0,-1}};
public:
//定义dfs递归函数
void dfs(vector<vector<char>>& grid,int x,int y){
//遍历过该位置后将该位置置为0,代表该位置已经遍历过
grid[x][y]='0';
//对矩阵的四个方向进行搜索
for(int k=0;k<4;++k)