目录
dfs搜索—岛屿数量
describe
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
示例 1:
输入:
grid =
[
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
示例 2:
输入:
grid =
[
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3
解析
对数组进行dfs深索, 每遇到一个岛屿, 计数加一.
dfs搜索4个不同的方向, 并且将到达过的点记为2.
递归中止条件为
1 越界, 即不在岛屿中
2 到达的点是海洋
3 已经到达过该点.
此类问题为一类问题, 可以成为模版题
c++代码
class Solution {
public:
int ans = 0;
int row,colunm;
int numIslands(vector<vector<char>>& grid) {
row = grid.size(),colunm = grid[0].size();
//遍历岛屿寻找1
for(int i=0;i<row;i++){
for(int j=0;j<colunm;j++){
if(grid[i][j]=='1'){
dfs(grid,i,j);
ans++;
}
}
}
return ans;
}
void dfs(vector<vector<char>>& grid, int r,int c){
//递归中止的条件
if(r<0||r>=row||c<0||c>=colunm||grid[r][c]=='0'||grid[r][c]=='2')return;
//到达该点留下标记
grid[r][c] = '2';
//搜索4个方向, 这种搜索方式为先dfs, 接着在判断该dfs是否满足题意
dfs(grid,r+1,c);
dfs(grid,r-1,c);
dfs(grid,r,c+1);
dfs(grid,r,c-1);
}
};
!!!
与树可以做类比
void dfs(treeNode* cur){
if(!cur)return;
//对该节点进行一些操作
dfs(cur->left);
dfs(cur->right);
//回溯的话在这里, 代码意思是回溯当前, 即cur节点.
}