解题思路:
图的连通性,一次遍历并不能遍历所有的island,要在深度搜索外加一个for循环,并做好被explored的点的标记
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(grid.size() == 0 || grid[0].size() == 0) return 0;
vector<vector<bool> > explored(grid.size(), vector<bool>(grid[0].size(), false));
vector<vector<int> > direction;
direction.push_back({0 , 1});
direction.push_back({1 , 0});
direction.push_back({0 , -1});
direction.push_back({-1 , 0});
printf("dirction OK\n");
int countIsland = 0;
int row = grid.size();
int col = grid[0].size();
for(int i = 0 ; i < row; ++i){
for(int j = 0; j < col; ++j){
if (!explored[i][j] && grid[i][j] == '1'){
printf("come int first cell\n");
countIsland++;
exploreIsland(i, j, grid, explored, direction);
}
}
}
return countIsland;
}
void exploreIsland(int i, int j, vector<vector<char> >& grid, vector<vector<bool> >& explored, vector<vector<int> >& direction){
if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size()) return;
if (!explored[i][j]){
if (grid[i][j] == '1'){
explored[i][j] = true;
for(int ind = 0; ind < 4; ++ind){
int x = i + direction[ind][0];
int y = j + direction[ind][1];
if (x < 0 || y < 0 || x >= grid.size() || y >= grid[0].size()) continue;
if (!explored[x][y] && grid[x][y] == '1'){
exploreIsland(x, y, grid, explored, direction);
}
}
}
}
}
};