飞地的数量问题

飞地的数量的题目

在m*n大小的gird里,其中0代表海洋,1代表陆地,题目为寻找被海洋包裹的陆地数目,最后返回值被海洋包围的陆地个数。

解题思路

首先飞地问题就是简单的矩阵遍历问题,在基本的矩阵遍历的基础上加上了一点点方法,就实现了飞地问题的解决。

首先我们先创建一个方法,DFS方法(深度优先搜索方法)

void DFS(int** grid,int i,int j,int n,int* m){
    if(i<0||j<0||j=>m||i=>n) return;
    if(grid[i][j]==0) return;
    grid[i][j]=0;
    DFS(grid,i,j+1,n,m);
    DFS(grid,i,j-1,n,m);
    DFS(grid,i+1,j,n,m);
    DFS(grid,i-1,j,n,m);
}

这里也运用了递归的思想将在第i+1行,第j+1列的元素上下左右的结点进行检验,如果是陆地就将其改变为海洋,因为在C语言中不能运用grid.length,grid[0].length。所以在这个函数最后加上了整个矩阵的长度与宽度。(如果有大佬找到如何将矩阵的长宽带入该方法中希望在评论区留下您的足迹,小白真的很需要你的帮助)

其次我们先确定在矩阵边界的都不算,那么我们就先将在边界周围的陆地排除完,排除方法就是调用上述方法寻找靠近边界的陆地,并将它们改为海洋(为了方便在之后的长宽表示均用n,m)

for(int i=0;i<n;i++){
    DFS(grid,i,0,n,m);
    DFS(grid,i,m-1,n,m);
}
for(int j=0;j<m;j++){
    DFS(grid,0,j,n,m);
    DFS(grid,n-1,j,n,m);
}

最后我们直接将矩阵进行遍历遇见1的结点,用一个参数计数。(如果是检查岛屿数的话可以在)

for(int i=0;i<n;i++)
    for(int j=0;j<m;j++){
        if(grid[i][j]==1) sum++;
}
for(int i=0;i<n;i++)            
    for(int j=0;j<m;j++){
        if(grid[i][j]==1){
            sum++;
            DFS(grid,i,j,n,m);        //如果查询岛屿数就添加这个
        }
}

在最后加上返回值就完成了。(下面有完整代码)

完整代码

void Dfs(int** grid,int i,int j,int n,int* m){
    if(i<0||j<0||i>=n||j>=*m) return;
    if(grid[i][j]==0) return;
    grid[i][j]=0;
    Dfs(grid,i,j+1,n,m);
    Dfs(grid,i,j-1,n,m);
    Dfs(grid,i+1,j,n,m);
    Dfs(grid,i-1,j,n,m);
}
int numEnclaves(int** grid, int n, int* m){
    int sum=0;
    for(int i=0;i<n;i++){
        Dfs(grid,i,0,n,m);
        Dfs(grid,i,*m-1,n,m);
    }
    for(int j=0;j<*m;j++){
        Dfs(grid,0,j,n,m);
        Dfs(grid,n-1,j,n,m);    
    }
    for(int i=0;i<=m-1;i++)
        for(int j=0;j<*m;j++){
            if(grid[i][j]==1){
                sum++;
            }
        }
    return sum;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值