• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

飞地的数量问题

武飞扬头像
low dog
帮助1

飞地的数量的题目

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

解题思路

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

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

  1.  
    void DFS(int** grid,int i,int j,int n,int* m){
  2.  
    if(i<0||j<0||j=>m||i=>n) return;
  3.  
    if(grid[i][j]==0) return;
  4.  
    grid[i][j]=0;
  5.  
    DFS(grid,i,j 1,n,m);
  6.  
    DFS(grid,i,j-1,n,m);
  7.  
    DFS(grid,i 1,j,n,m);
  8.  
    DFS(grid,i-1,j,n,m);
  9.  
    }

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

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

  1.  
    for(int i=0;i<n;i ){
  2.  
    DFS(grid,i,0,n,m);
  3.  
    DFS(grid,i,m-1,n,m);
  4.  
    }
  5.  
    for(int j=0;j<m;j ){
  6.  
    DFS(grid,0,j,n,m);
  7.  
    DFS(grid,n-1,j,n,m);
  8.  
    }

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

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

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

完整代码

  1.  
    void Dfs(int** grid,int i,int j,int n,int* m){
  2.  
    if(i<0||j<0||i>=n||j>=*m) return;
  3.  
    if(grid[i][j]==0) return;
  4.  
    grid[i][j]=0;
  5.  
    Dfs(grid,i,j 1,n,m);
  6.  
    Dfs(grid,i,j-1,n,m);
  7.  
    Dfs(grid,i 1,j,n,m);
  8.  
    Dfs(grid,i-1,j,n,m);
  9.  
    }
  10.  
    int numEnclaves(int** grid, int n, int* m){
  11.  
    int sum=0;
  12.  
    for(int i=0;i<n;i ){
  13.  
    Dfs(grid,i,0,n,m);
  14.  
    Dfs(grid,i,*m-1,n,m);
  15.  
    }
  16.  
    for(int j=0;j<*m;j ){
  17.  
    Dfs(grid,0,j,n,m);
  18.  
    Dfs(grid,n-1,j,n,m);
  19.  
    }
  20.  
    for(int i=0;i<=m-1;i )
  21.  
    for(int j=0;j<*m;j ){
  22.  
    if(grid[i][j]==1){
  23.  
    sum ;
  24.  
    }
  25.  
    }
  26.  
    return sum;
  27.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfcjgk
系列文章
更多 icon
同类精品
更多 icon
继续加载