#include <vector>
using namespace std;
class Solution {
public:
// 方向数组:上下左右
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
/**
* 判断岛屿数量
* @param grid char字符型vector<vector<>>
* @return int整型
*/
int solve(vector<vector<char> >& grid) {
if (grid.empty() || grid[0].empty()) {
return 0;
}
int rows = grid.size();
int cols = grid[0].size();
vector<vector<bool>> visited(rows, vector<bool>(cols, false));
int islandCount = 0;
// 遍历整个网格
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
// 找到未访问的陆地,开始DFS
if (grid[i][j] == '1' && !visited[i][j]) {
dfs(grid, visited, i, j);
islandCount++;
}
}
}
return islandCount;
}
// DFS:标记所有相连的陆地为已访问
void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
// 标记当前位置为已访问
visited[x][y] = true;
// 探索四个方向
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
// 检查边界和是否为未访问的陆地
if (nx >= 0 && nx < grid.size() && ny >= 0 && ny < grid[0].size()) {
if (grid[nx][ny] == '1' && !visited[nx][ny]) {
dfs(grid, visited, nx, ny);
}
}
}
}
};