2023.6.18每日一题

该文章介绍了一种利用深度优先搜索(DFS)算法解决矩阵中找最大封闭岛的问题。在遍历矩阵时,当遇到值为0且不在边界的位置,会进行DFS搜索,标记并连接所有相邻的0,以避免重复计算,最终找到最大的封闭岛并增加答案计数。
摘要由CSDN通过智能技术生成

         此题可以用dfs搜索,以当前位置为0向上下左右四个方向搜索,当前位置为0时,只有当前位置处于矩阵边界时,不满足此岛屿为封闭岛的条件,否则此岛必为封闭岛,现在要做的是去找和它相连的0,把这个最大的封闭岛找出来,并标记,防止在下一次更新当前位置时重复计算。

        

class Solution {
public:
    int closedIsland(vector<vector<int>>& grid) {
        int ans=0;
        int m=grid.size();
        int n=grid[0].size();
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==0&&dfs(grid,i,j,m,n)) ans++; //以当前位置搜索,如果不是边界,答案++
            }
        }
        return ans;
    }

    bool dfs(vector<vector<int>>& grid,int i,int j,int m,int n)
    {
        if(i<0||i>=m||j<0||j>=n) return false; //搜到边界不满足条件

        if(grid[i][j]==0)
        {
            grid[i][j]=-1; //标记防止重复计算
            int ans1=dfs(grid,i+1,j,m,n); //向四个方向搜索
            int ans2=dfs(grid,i,j+1,m,n);
            int ans3=dfs(grid,i-1,j,m,n);
            int ans4=dfs(grid,i,j-1,m,n);
            return ans1&&ans2&&ans3&&ans4;
        }
        else return true; //如果搜到1也返回true,因为只有边界是不满足条件的
    }
};

        此题只要当前位置是0且不为边界,答案肯定要+1,dfs的作用是将与当前位置相连的所有0标记,防止下次搜索时重复计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值