题目描述:来自LeetCode
方法一:深度优先搜索
可以将矩阵看成一个图,进行图的深度优先搜索,每两个相邻的‘1’可以看成是有一条边,在学数据结构的时候,我们知道,连通图进行深度优先遍历的时候,只会搜索一次,非联通图有几个联通分支就会遍历几次,巧了!这个题的意思其实就是让求联通分支的个数啊!!所以对遍历二维矩阵,进行深度优先遍历,每dfs一次,就记录将记录岛屿数量的变量+1,遍历的过程,要将遍历过的数据进行标记,在这里,将‘1’修改为‘2’即可。
dfs结束的条件就是判断数组是否越界,或者该位置的值不等于‘1’
代码实现c++:
int numIslands(vector<vector<char>>& grid) {
int num=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
dfs(grid,i,j);
num++;
}
}
}
return num;
}
void dfs(vector<vector<char>>& grid,int i,int j){
if(i<0||i>=grid.size()||j<0||j>=grid[0].size()||grid[i][j]!='1') return;
grid[i][j]='2';
dfs(grid,i-1,j);
dfs(grid,i,j-1);
dfs(grid,i+1,j);
dfs(grid,i,j+1);
}
方法二:广度优先搜索
其实和深搜一样,只是广度优先搜索需要借助一个队列,原理是一样的。
int numIslands(vector<vector<char>>& grid) {
int num=0;
for(int i=0;i<grid.size();i++){
for(int j=0;j<grid[0].size();j++){
if(grid[i][j]=='1'){
num++;
bfs(grid,i,j);
}
}
}
return num;
}
void bfs(vector<vector<char>>& grid,int i,int j){
int m=grid.size(),n=grid[0].size();
queue<pair<int, int>> que;
que.push({i,j});
while(!que.empty()){
auto nums=que.front();
que.pop();
int r=nums.first,l=nums.second;
if(r>=0&&r<m&&l>=0&&l<n&&grid[r][l]=='1'){
grid[r][l]=2;
que.push({r-1,l});
que.push({r,l-1});
que.push({r+1,l});
que.push({r,l+1});
}
}
}
如有错误,欢迎指出~