Leetcode;200. 岛屿数量(DFS+BFS算法 C++带详细注释)

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;//返回岛屿数

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值