代码随想录算法训练营Day-50 图论02 | 99.岛屿数量-深搜、99.岛屿数量-广搜 、100.岛屿的最大面积

99.岛屿数量-深搜

主函数 比较朴素:定义基础变量,接收数据,遍历图节点,对每个节点进行处理:遇到没访问过的陆地就result++,然后深搜 这篇陆地的上下左右 ,把和这片土地挨着的所有土地标记为访问过,也就是把一片岛屿都标记为访问过,之后再遍历到这片岛屿的其他陆地节点时就直接跳过了。遍历完之后,把所有的新大陆计数并搜索成岛屿,最后结果就是岛屿数量了。

深搜函数:有两种写法

一种是,终止条件显示写出,也就是终止条件判断节点是否访问过以及是否是陆地,如果不是陆地或者被访问过,那么就return,作为终止条件,然后在函数逻辑里面只进行下一个节点(上下左右)是否越界的判断;

(其实也可以把越界判断也放在终止条件里,也就是一开始判断x,y是否越界,下面递归逻辑里的下一个节点就不需要进行判断了。

cpp 复制代码
#include<iostream>
using namespace std;
#include<vector>

int dir[4][2]={0,1,1,0,-1,0,0,-1};

void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){
    if(grid[x][y]==0 || visited[x][y]==true) return;
    visited[x][y] = true;
    for(int i=0;i<4;i++){
        int nextx = x+dir[i][0];
        int nexty = y+dir[i][1];
        if(nextx<0 || nextx>=grid.size() || nexty<0 || nexty>=grid[0].size()) continue;
        dfs(grid, visited, nextx, nexty);
    }
}


int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> grid(n,vector<int>(m));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>grid[i][j];
        }
    }
    vector<vector<bool>> visited(n,vector<bool>(m,false));
    int result=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(grid[i][j]==1 && visited[i][j]==0){
                result++;
                dfs(grid, visited, i, j);
            }
        }
    }
    cout<<result<<endl;
}

一种是,终止条件隐式在递归逻辑里面,由于只有符合条件(索引不越界,坐标是陆地且未被访问)的节点才会被送入下一层递归,所以其实相当于隐含了终止条件。

cpp 复制代码
#include<iostream>
using namespace std;
#include<vector>

int dir[4][2]={0,1,1,0,-1,0,0,-1};

void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){
    for(int i=0;i<4;i++){
        int nextx = x+dir[i][0];
        int nexty = y+dir[i][1];
        if(nextx<0 || nextx>=grid.size() || nexty<0 || nexty>=grid[0].size()) continue;
        if(grid[nextx][nexty]==1 && visited[nextx][nexty]==false){
            visited[nextx][nexty] = true;
            dfs(grid, visited, nextx, nexty);
        }
        
    }
}


int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> grid(n,vector<int>(m));
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>grid[i][j];
        }
    }
    vector<vector<bool>> visited(n,vector<bool>(m,false));
    int result=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(grid[i][j]==1 && visited[i][j]==0){
                result++;
                dfs(grid, visited, i, j);
            }
        }
    }
    cout<<result<<endl;
}

99.岛屿数量-广搜


100.岛屿的最大面积


相关推荐
沫璃染墨14 分钟前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
打码的老程是远篁17 分钟前
手把手教你玩转大模型——3. Transformer 的位置编码——模型怎么知道谁在前,谁在后?
人工智能·算法
嘎嘎风18 分钟前
MiniMind 学习笔记之 06 一张图、一百行:MiniMind 的骨架
算法·源码
郝学胜_神的一滴18 分钟前
C++ Templates 05:那些容易踩坑的技巧性基础知识
c++·visual studio
用户73416810354821 分钟前
只盯被动响应做状态监测?论“控制信号”在变工况故障诊断中的重要作用
算法
Ivanqhz23 分钟前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习
罗湖老棍子32 分钟前
荒岛野人(信息学奥赛一本通- P1637)(洛谷-P2421)
算法·数论·枚举·裴蜀定理·扩展欧几里得·扩展中国剩余定理
朝朝辞暮i36 分钟前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
400分44 分钟前
具身智能系列之从零到「机械臂会放试管」:π0.5 VLA 真机部署完全指南【第一节】
算法
小宋10211 小时前
一套服务托管多个 LoRA:适配器加载、租户隔离与热切换实战
大数据·人工智能·算法