解题思路:
BFS:
对图进行遍历,在'1'处开始广搜,每次搜索上下左右四个方向,搜索的坐标仍然为'1'就标注已经被搜索,这样每次BFS都能把一个岛屿的'1'全部变成visited。所以一次BFS就能找到一个岛屿,BFS的过程是为了把这个岛屿的坐标变成visited状态这样才能防止下一个'1'坐标BFS的过程不被影响
DFS:
思路同BFS
//dfs
// 版本一
class Solution {
public:
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(vector<vector<bool>>& visited,vector<vector<char>>& grid,int x,int y){
for(int i=0;i<4;i++){
int fx=x+dx[i];
int fy=y+dy[i];
if(fx<0 || fx>=grid.size() || fy<0 || fy>=grid[0].size())continue;
else if(!visited[fx][fy] && grid[fx][fy]=='1'){
visited[fx][fy]=true;
dfs(visited,grid,fx,fy);
}
}
}
int numIslands(vector<vector<char>>& grid) {
int ans=0;
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited=vector<vector<bool>>(n,vector<bool>(m,false));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visited[i][j] && grid[i][j]=='1'){
ans++;
visited[i][j]=true;
dfs(visited,grid,i,j);
}
}
}
return ans;
}
};
//bfs
class Solution {
public:
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void bfs(vector<vector<char>>& grid,vector<vector<bool>>& visit,int x,int y){
queue<pair<int,int>> q;
q.push({x,y});
visit[x][y]=true;
while(!q.empty()){
pair<int,int> p=q.front();
q.pop();
int xx=p.first;
int yy=p.second;
for(int i=0;i<4;i++){
int fx=xx+dx[i];
int fy=yy+dy[i];
if(fx<0 || fx>=grid.size() || fy<0 || fy>=grid[0].size()) continue;
if(!visit[fx][fy]&&grid[fx][fy]=='1'){
q.push({fx,fy});
visit[fx][fy]=true;
}
}
}
}
int numIslands(vector<vector<char>>& grid) {
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited=vector<vector<bool>>(n,vector<bool>(m,false));
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(!visited[i][j] && grid[i][j]=='1'){
ans++;
bfs(grid,visited,i,j);
}
}
}
return ans;
}
};