【力扣】200.岛屿数量(染色法DFS深搜)
岛屿数量
题目描述
链接:力扣:200.岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。。
此外,你可以假设。网格的四条边均被水包围。
思路染色法
遇到一个岛屿,就将相邻的岛屿全部设置为'0',然后答案加1。
几个细节的处理
- 要先去判断当前的图格类型,再去判断是否返回, 否则遇到只有
一个图格答案就是0 - 搜索时要注意先搜索左下角
代码
class Solution {
public:
int m, n, res;
int vx[4] = {0, -1, 1, 0};
int vy[4] = {-1, 0, 0, 1};
vector<vector<char>> g;
vector<vector<bool>> state;
int numIslands(vector<vector<char>>& grid) {
res = 0;
g = grid;
m = grid.size();
n = grid[0].size();
state.resize(m, vector<bool>(n, false));
dfs(0, 0, 1);
return res;
}
inline void dfs(int x, int y, int u) {
state[x][y] = true;
if (g[x][y] == '1') {
res += 1;
del(x, y);
}
if (u == m*n) {
return;
}
for (int i = 0; i < 4; i++) {
int nx = x + vx[i], ny = y + vy[i];
if (nx < 0 || ny < 0 || nx >= m || ny >= n) {
continue;
}
if (state[nx][ny] == false) {
dfs(nx, ny, u+1);
}
}
}
inline void del(int x, int y) {
g[x][y] = '0';
for (int i = 0; i < 4; i++) {
int nx = x + vx[i], ny = y + vy[i];
if (nx < 0 || ny < 0 || nx >= m || ny >= n) {
continue;
}
if (g[nx][ny] == '1') {
del(nx, ny);
}
}
return;
}
};

浙公网安备 33010602011771号