文章目录
一、网格dfs的遍历框架:
void dfs(vector<vector<int>& grid>, int r, int c) {
if(!inArea(grid, r, c)) {
return;
}
//如果这个格子不是岛屿,直接返回
if(grid[r][c] != 1) {
return;
}
//将格子标记为已遍历过
grid[r][c] = 2;
//访问上、下、左、右四个相邻结点
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
//判断坐标(r, c)是否在网格中
bool inArea(vector<vector<int>& grid>, int r, int c) {
return r >= 0 && r < grid.size() && c >=0 && c < grid[0].size();
}
二、经典题目
1.岛屿的周长leetcode463题
class Solution {
public:
bool inArea(vector<vector<int>>& grid, int r, int c) {
return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();
}
int dfs(vector<vector<int>>& grid, int r, int c) {
//(r, c)超出网格范围,对应与网格边界相邻的一条边,周长加1
if(!inArea(grid, r, c)) {
return 1;
}
//对应与海洋相邻的一条边,周长加1
if(grid[r][c] == 0) {
return 1;
}
//与陆地相邻的边,不计入周长
if(grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2;
return dfs(grid, r - 1, c) + dfs(grid, r + 1, c)
+ dfs(grid, r, c - 1) + dfs(grid, r, c + 1);
}
int islandPerimeter(vector<vector<int>>& grid) {
for(int r = 0; r < grid.size(); ++r) {
for(int c = 0; c < grid[0].size(); ++c) {
if(grid[r][c] == 1) {
return dfs(grid, r, c);
}
}
}
return 0;
}
};
2.岛屿数量leetcode200题
代码如下(示例):
class Solution {
public:
bool inArea(vector<vector<char>>& grid, int r, int c) {
return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();
}
void dfs(vector<vector<char>>& grid, int r, int c) {
if(!inArea(grid, r, c)) {
return;
}
if(grid[r][c] != '1') {
return;
}
grid[r][c] = '2';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
}
int numIslands(vector<vector<char>>& grid) {
int res = 0;
int nc = grid[0].size();
for(int r = 0; r < grid.size(); ++r) {
for(int c = 0; c < grid[0].size(); ++c) {
if(grid[r][c] == '1') {
++ res;
dfs(grid, r, c);
}
}
}
return res;
}
};
该处使用的url网络请求的数据。
3.岛屿的最大面积leetcode695题
class Solution {
public:
bool inArea(vector<vector<int>>& grid, int r, int c) {
return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();
}
int area(vector<vector<int>>& grid, int r, int c) {
if(!inArea(grid, r, c)) {
return 0;
}
if(grid[r][c] != 1) {
return 0;
}
grid[r][c] = 2;
return 1 + area(grid, r - 1, c) + area(grid, r + 1, c)
+ area(grid, r, c - 1) + area(grid, r, c + 1);
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int res = 0;
int nr = grid.size();
if(!nr) {
return 0;
}
int nc = grid[0].size();
for(int r = 0; r < nr; ++r) {
for(int c = 0; c < nc; ++c) {
if(grid[r][c] == 1) {
int a = area(grid, r, c);
res = max(res, a);
}
}
}
return res;
}
};
参考资料
(1) leetcode官方题解
(2) https://leetcode.cn/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/