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

99.岛屿数量 深搜

题目链接:99.岛屿数量 深搜

深搜DFS:深搜的模板长得和回溯很像。深搜三部曲:1.确定深搜函数参数,2.确认终止条件,3.处理目前搜索节点出发的路径。除此之外,在做深搜题时涉及到了需要自己定义图的过程。由于习惯了力扣,这次忽然需要自己定义还是比较吃力的,一共有两种方法,一个是邻接矩阵,一个是邻接表。邻接矩阵就是二维数组,邻接表是一维数组和链表的结合,就是存储链表的一维数组。在定义好了邻接矩阵或者邻接表之后,就可以正常遍历输入路径了。然后正常进行深搜,写好终止条件和本环节处理条件以及回溯,就可以了。

代码:

#include<iostream>
using namespace std;
#include<vector>

//深搜
//深搜三部曲 确认深搜函数参数  确认终止条件  处理目前结点出发的路径
int number=0;//岛屿数量
void dfs(vector<vector<int>> &graph,int a, int b);

int main(){
    //首先建表
    int n, m, insert;
    cin>>n>>m;
    vector<vector<int>> graph(n,vector<int>(m,0));
    //为图赋值
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>insert;
            graph[i][j]=insert;
        }
    }
    int number=0;
    
    //访问过的位置改为0
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(graph[i][j]==1){
                number++;
                dfs(graph,i,j);
            }
        } 
    }
    cout << number;
    return 0;
}

//计算岛屿数量 深搜
void dfs(vector<vector<int>> &graph,int a, int b){
    if(graph[a][b]==0) return;
    //如果四周都为0 则为岛屿 (即所求位置超出范围或者值为0)
    //vector<int> cur(4,0);//代表左上右下
    int row = graph[0].size();//行数
    int column =graph.size();//列数
    graph[a][b]=0;
    if(b-1>=0)  dfs(graph,a,b-1);
    if(a-1>=0)  dfs(graph,a-1,b);
    if(b+1<row)  dfs(graph,a,b+1);
    if(a+1<column)  dfs(graph,a+1,b);
    
}

99.岛屿数量 广搜

题目链接.99.岛屿数量 广搜

广搜BFS:至于广搜,相比于深搜一条路跑到黑的过程,广搜是一圈一圈搜的。广搜是从起点出发,一圈一圈进行搜索,遇到终点时,所记录的路径长度就是最短路径。但是在做岛屿问题时,要对遍历完的坐标做标记,比如说true和false。我采用了将原来标记的1改为0的方法,两者思路相同。实现广搜一般使用的容器有数组,栈,队列。最常用的是队列。

代码:

#include<iostream>
using namespace std;
#include<vector>
#include<queue>

void bfs(vector<vector<int>> &graph,int a, int b);

int main(){
    //首先建表
    int n, m, insert;
    cin>>n>>m;
    vector<vector<int>> graph(n,vector<int>(m,0));
    //为图赋值
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>insert;
            graph[i][j]=insert;
        }
    }
    int number=0;    
    //访问过的位置改为0
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(graph[i][j]==1){
                number++;
                bfs(graph,i,j);
            }
        } 
    }
    cout << number;
    return 0;
}

//计算岛屿数量 广搜
void bfs(vector<vector<int>> &graph,int a, int b){

    queue<pair<int,int>> que;//队列里面存的是坐标
    que.push({a,b});
    int row = graph[0].size();//行数
    int column =graph.size();//列数
    
    while(!que.empty()){
        pair<int,int> location = que.front();
        a=location.first;
        b=location.second;
        graph[a][b]=0;
        que.pop();
        //上下左右存入队列
        if(b-1>=0)  dfs(graph,a,b-1);
        if(a-1>=0)  dfs(graph,a-1,b);
        if(b+1<row)  dfs(graph,a,b+1);
        if(a+1<column)  dfs(graph,a+1,b);
    }
    
}

100.岛屿的最大面积 

题目链接:100.岛屿的最大面积 

思路:一开始把深搜的终止条件写在for循环里面了 卡了很久。

代码:

#include<iostream>
using namespace std;
#include<vector>


//深搜
vector<vector<int>> mov={{0,-1,1,0},{-1,0,0,1}};
void dfs(vector<vector<bool>> &visited,vector<vector<int>> &graph, int a, int b,int &res){
    //左上下右
    if(visited[a][b]==false&&graph[a][b]==1){
           visited[a][b]=true;
           res++;
        for(int k=0;k<4;k++){
           int cur_row = a + mov[0][k];
           int cur_col = b + mov[1][k];
           int i=graph[0].size();
           int j=graph.size();
           if(cur_row<0||cur_row>=j||cur_col<0||cur_col>=i)continue;
           dfs(visited,graph,cur_row,cur_col,res);
        }
    }    
}

int main(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>> graph(n,(vector<int>(m,0)));
    vector<vector<bool>> visited(n,(vector<bool>(m,false)));
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>graph[i][j];
        }
    }
    int MAX=0;
    int res=0;
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(!visited[i][j]&&graph[i][j]==1){
                res=0;
                dfs(visited,graph,i,j,res);
                MAX=max(MAX,res);                
            }            
        }
    }
    cout<<MAX;   
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值