题目:

  有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。

  我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。

  如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。

  请返回封闭岛屿的数目。 

   

  输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
  输出:2
  解释:灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。

 分析:

  1.对于边界而言,即使其为陆地,也至少存在一个变不能临近水域,所以不可能构成孤岛;

  2.对于边界上的陆地而言,其相邻的陆地,肯定也构不成孤岛,即所能到达的陆地,均不可以。

  3.对于剩余区域的陆地X,其所能到达的陆地Y,能够和X构成同一片岛屿。

 方案:(参考别人的https://leetcode-cn.com/problems/number-of-closed-islands/solution/yi-ti-kan-tou-dfs-he-dfs-by-xiao-xiao-suan-fa/)

  直接从边界的陆地开始DFS或BFS遍历,只要边界陆地能遍历到的地方就不是封闭岛屿,同时我们也要将遍历过得点置为1,表示该位置已经遍历过。最后,里面为0的位置都是属于封闭岛屿的陆地了。

 代码部分:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. void dfs(int x, int y, vector<vector<int>>& grid) {
  6. int xlen = grid.size(); //行
  7. int ylen = grid[].size(); //列
  8. if (x >= xlen || y >= ylen || x < || y < || grid[x][y] == ) { //越界或者为水域,直接返回
  9. return;
  10. }
  11. grid[x][y] = ; //标记已遍历过的节点
  12. int vx[] = { , , , - }; //记录四个方向,如vx[0],vy[0],即横坐标不变,纵坐标加1,向上移动一步
  13. int vy[] = { , , -, };
  14. for (int i = ; i < ; i++)
  15. {
  16. dfs(x + vx[i],y + vy[i],grid); //遍历剩余四个方向
  17. }
  18. }
  19.  
  20. void printGrid(vector<vector<int> > grid) { //打印二维矩阵
  21. for (int i = ; i < grid.size(); i++)
  22. {
  23. for (int j = ; j < grid[].size(); j++)
  24. {
  25. cout << grid[i][j] << " ";
  26. }
  27. cout << endl;
  28. }
  29. }
  30.  
  31. int closedIsland(vector<vector<int> > &grid)
  32. {
  33. int result = ;
  34. int y = grid.size(); //一共有多少行
  35. int x = grid[].size();
  36. int i, j;
  37. //从边界往里遍历,凡是能到达的所有陆地,均不能构成闭合岛屿
  38. for (i = ; i < y; i++) {
  39. for (j= ; j < x; j++)
  40. {
  41. if (i == || j == || i == y - || j == x - ) {
  42. dfs(i, j, grid);
  43. }
  44. }
  45. }
  46. cout << "\n边界处理完成后的结果:" << endl;
  47. printGrid(grid);
  48. //继续遍历,剩余结点中,某个陆地x能到达的所有区域,构成一个孤岛,统计有多少个这样的x
  49. for (i = ; i < grid.size(); i++)
  50. {
  51. for (j= ; j < grid[].size(); j++)
  52. {
  53. if (grid[i][j] == ) //起点,遍历结束后,所有可到达的点被标记为水域,即产生一个孤岛
  54. {
  55. result++;
  56. dfs(i,j,grid);
  57. }
  58. }
  59. }
  60. return result;
  61. }
  62.  
  63. int main() {
  64. vector<vector<int> > grid;
  65. //输入二维矩阵
  66. int m, n;
  67. cin >> m >> n;
  68. vector<int> temp(n); //结束临时一维数组构建二维数组
  69. grid.resize(m,temp); //二维数组大小初始化(注意用法)
  70. int i, j;
  71. for (i = ; i < m; i++)
  72. {
  73. for (j = ; j < n;j++)
  74. {
  75. cin >> grid[i][j]; //输入二维数组元素
  76. }
  77. }
  78.  
  79. cout << "\n孤岛计算结果:" << closedIsland(grid) << endl; //输出计算结果
  80.  
  81. }

运行结果:

  

分析:

  

  第一步是将1,2两块区域排除,毕竟它们处于边界,不可能成为孤岛区域

  第二步是找出3,4,两块区域,比如第4块,想从左上角开始深度优先遍历(当然广度也可以),岂能到达的所有陆地领域都是联通的,共同构成一个孤岛,因此,ret+1;

  最后,返回结果!

Leetcode 1254. 统计封闭岛屿的数目的更多相关文章

  1. LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands

    地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...

  2. asp.net——统计输入的字符数目

    asp.net——统计输入的字符数目 题目: 在页面中有一个TextBox输入框,一个显示文字用的Label,一个提交按钮Button.在TextBox中输入一段英文字母,点击按钮提交后统计其中字母‘ ...

  3. 【LeetCode】1399. 统计最大组的数目 Count Largest Group

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接求 日期 题目地址:https://leetcod ...

  4. LeetCode 5216. 统计元音字母序列的数目(Java)DP

    5216. 统计元音字母序列的数目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', ...

  5. [LeetCode] Number of Islands 岛屿的数量

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  6. LeetCode 463. Island Perimeter岛屿的周长 (C++)

    题目: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 repr ...

  7. linux 统计命令执行后的行数或者统计目录下文件数目

    ls |wc 是统计你这个目录下的文件数目.ls |wc -l是输出第一个结果即31即文件的数目.

  8. LeetCode 1248. 统计「优美子数组」

    地址 https://www.acwing.com/solution/leetcode/content/5801/ 题目描述给你一个整数数组 nums 和一个整数 k. 如果某个子数组中恰好有 k 个 ...

  9. Java实现 LeetCode 828 统计子串中的唯一字符(暴力+转数组)

    828. 统计子串中的唯一字符 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数. 例如:s = "LEETCODE" ...

随机推荐

  1. 《 .NET并发编程实战》实战习题集 - 3 - CRUD项目中使用FP

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  2. PHP 垃圾回收机制详解

    前言:之前对PHP的GC只是了解了个大概,这次详细了解下PHP的垃圾回收机制(GC). 介于网上大部分都是PHP5.X的GC,虽然 php5 到 php7 GC部分做出的改动较小,但我觉得还是一起写下 ...

  3. Client 客户端AspNetCore.SignalR 通讯服务器 Quartz 执行任务

    背景 需要Client跑服务在终端间隔执行任务,我的目标是运行在树莓派上 Client代码 如果未连接成功时隔3秒重新连接服务器 public static void Reconnect() { va ...

  4. 微信小程序主要开发语言

    小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求. 在大部分开发者看来,ECMAScript和JavaScrip ...

  5. Springboot项目中pom.xml的Oracle配置错误问题

    这几天刚开始学习Springboot碰见各种坑啊,这里记录一个添加Oracle引用的解决方案. 前提:开发工具IDEA2019.2,SpringBoot,maven项目:Oracle版本是Oracle ...

  6. 1.Shell特殊位置变量

    $0    文件名及路径 $1,$2    参数1,参数2 , 也可以用${1}  和 ${2} 来表示 $#    传递给脚本或函数的参数个数 $$    当前Shell进程ID $?    判断上 ...

  7. 【微信小程序】抽象组件使用示例

        1.配置页面路径 ./app.json { "pages":[ "pages/index/index", "pages/logs/logs&q ...

  8. h5和native测试时的区别

    我们以往的APP是使用原生系统内核的,相当于直接在系统上操作,是我们传统意义上的软件,更加稳定 H5的APP先得调用系统的浏览器内核,相当于是在网页中进行操作,较原生APP稳定性稍差,似乎还没有百万级 ...

  9. 一个APACHE TOMCAT漏洞修复

    这种情况加个SSL证书就行了  就是HTTPS协议

  10. Linux shell sed命令使用

    Linux处理文本文件的工具:     grep        过滤文件内容     sed            编辑文件内容     awk             正则表达式Regex      ...