Leetcode;200. 岛屿数量(DFS+BFS算法 C++带详细注释)
class Solution {
public:
// void dfs(vector<vector<char>>& grid,int i, int j)//DFS遍历函数
// { int row=grid.size();//矩阵行数
// int col=grid[0].size();//矩阵列数
// if(i<0||i>=row||j<0||j>=col) return;//超出范围返回
// if(grid[i][j]!='1') return;//是海洋或已遍历过也返回
// grid[i][j]='2';//将该陆地标为2,已遍历过
// dfs(grid,i-1,j);//递归遍历周围的陆地
// dfs(grid,i+1,j);//递归遍历周围的陆地
// dfs(grid,i,j-1);//递归遍历周围的陆地
// dfs(grid,i,j+1);//递归遍历周围的陆地
// }
// int numIslands(vector<vector<char>>& grid) {
// int row=grid.size();//矩阵行数
// if(row==0) return 0;//空矩阵直接返回0
// int col=grid[0].size();//矩阵列数
// int isNum=0;//岛屿数
// for(int i=0;i<row;i++)//遍历行
// {
// for(int j=0;j<col;j++)//遍历列
// {
// if(grid[i][j]=='1')//遇到陆地
// {
// isNum++;//岛屿数加一
// dfs(grid,i,j);//深度遍历该岛屿,将其上的陆地全标为2
// }
// }
// }
// return isNum;//返回岛屿数
// }
int numIslands(vector<vector<char>>& grid) {//BFS遍历函数
int row=grid.size();//行数
if(row==0)return 0;//空直接返回
int col=grid[0].size();//列数
int isNum=0;//岛屿数
for(int i=0;i<row;i++)//遍历行
{
for(int j=0;j<col;j++)//遍历列
{
if(grid[i][j]=='1')//遇到陆地
{
queue<pair<int,int>>que;//bfs遍历队列
isNum++;//岛屿数加一
que.push({i,j});//位置入队
while(!que.empty())//队列非空循环
{
auto loc=que.front();//取队头元素
que.pop();//删除队头元素
int r=loc.first,l=loc.second;//取出行列位置
if(r-1>=0&&grid[r-1][l]=='1') //看四个邻居是否在范围内并为陆地
{
que.push({r-1,l});//入队
grid[r-1][l]='2';//标记为已访问
}
if(r+1<row&&grid[r+1][l]=='1')
{
que.push({r+1,l});//入队
grid[r+1][l]='2';//标记为已访问
}
if(l-1>=0&&grid[r][l-1]=='1')
{
que.push({r,l-1});//入队
grid[r][l-1]='2';//标记为已访问
}
if(l+1<col&&grid[r][l+1]=='1')
{
que.push({r,l+1});//入队
grid[r][l+1]='2';//标记为已访问
}
}
}
}
}
return isNum;//返回岛屿数
}
};