BFS
class Solution {
public:
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
vector<vector<char>> g;
queue<pair<int, int>> q;
int n, m;
void bfs(int x, int y)
{
q.push({x, y});
g[x][y] = '#'; // 标记点(x,y)已经被访问过了
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ )
{
int a = t.first + dx[i];
int b = t.second + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '#' || g[a][b] == '0') continue;
q.push({a, b});
g[a][b] = '#'; // 标记点(a,b)已经被访问过了
}
}
}
int numIslands(vector<vector<char>>& grid) {
g = grid;
if (g.empty() || g[0].empty()) return 0;
n = g.size(), m = g[0].size();
int res = 0;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
// 如果点(i,j)没有被访问过 并且 它是陆地
if (g[i][j] != '#' && g[i][j] == '1')
{
bfs(i, j);
res ++ ;
}
}
}
return res;
}
};
DFS
class Solution {
public:
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
vector<vector<char>> g;
queue<pair<int, int>> q;
int n, m;
void dfs(int x, int y)
{
g[x][y] = '#';
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if (a < 0 || a >= n || b < 0 || b >= m || g[a][b] == '#' || g[a][b] == '0') continue;
dfs(a, b);
}
}
int numIslands(vector<vector<char>>& grid) {
g = grid;
if (g.empty() || g[0].empty()) return 0;
n = g.size(), m = g[0].size();
int res = 0;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
if (g[i][j] != '#' && g[i][j] == '1')
{
dfs(i, j);
res ++ ;
}
}
}
return res;
}
};