深度优先搜索(DFS)

本文介绍了深度优先搜索(DFS)的概念及其应用,通过一个LeetCode的岛屿最大面积问题来阐述如何使用DFS解决实际问题。DFS用于遍历网格中的岛屿,通过递归方式计算每个岛屿的面积,并寻找最大的岛屿面积。代码分析部分展示了如何遍历每个岛屿的面积以及整个容器,以找到最大岛屿的面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度优先搜索

介绍

深度优先搜索(DFS)为随机沿一条支路走到头,后返回上一岔路继续重复操作,最后遍历全部的过程。

一条路线:
A出发,随机三条支路选择B;B访问C;C访问D;因为遍历过A,所以不能从D访问A,应返回到C,继而返回到B,最后返回到A,由A访问E。

全部过程为:
A->B->C->D->E
或者:
A->E->B->C->D
A->E->D->C->B
等等。

案例(LeetCode 第695题岛屿最大面积,C++实现)

案例链接:https://leetcode-cn.com/problems/max-area-of-island/

案例描述:

给你一个大小为 m x n 的二进制矩阵 grid 。

岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

岛屿的面积是岛上值为 1 的单元格的数目。

计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

简单的说,就是遍历坐标,返回相邻1(土地)个数的最大值(岛屿的面积)。
在这里插入图片描述

代码分析

遍历每个岛屿的面积

	/*返回每处岛屿的面积*/
    int dfs(vector<vector<int>>& grid, int cur_i, int cur_j)
    {
    	//每个坐标不为1或不满足题意返回面积为0
        if(grid.size()==0 || cur_i<0 || cur_j<0 || cur_i==grid.size() || 
            cur_j==grid[0].size() || grid[cur_i][cur_j]!=1)
        {
            return 0;
        }
        //找到开始为1的坐标,开始遍历后,已经访问的位置置0,避免回溯时重复访问
        grid[cur_i][cur_j]=0;   //第一个1置零
        //以访问的位置为中心,向上下左右访问,如果为1,面积就加1
        int dfs_i[4]={0,0,1,-1};
        int dfs_j[4]={1,-1,0,0};   //向四个方向遍历
        int ans=1;	//最初的面积
        for(int count=0;count<4;count++)
        {
            int next_i=cur_i + dfs_i[count];
            int next_j=cur_j + dfs_j[count];   //四个方向的位置坐标

            ans += dfs(grid, next_i, next_j);     //递归
        }
        return ans;
    }

遍历容器,找到面积的最大值

int maxAreaOfIsland(vector<vector<int>>& grid) {
        int ans=0;	//一开始并未找到1,先令面积为0
        for(int i=0;i<grid.size();i++)
        {
            for(int j=0;j<grid[0].size();j++)
            {
                ans = max(ans,dfs(grid,i,j));   //取每次的最大值
            }
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值