Leetcode 1254. 统计封闭岛屿的数目
题目:
有一个二维矩阵 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的位置都是属于封闭岛屿的陆地了。
代码部分:
#include <iostream>
#include <vector>
using namespace std; void dfs(int x, int y, vector<vector<int>>& grid) {
int xlen = grid.size(); //行
int ylen = grid[].size(); //列
if (x >= xlen || y >= ylen || x < || y < || grid[x][y] == ) { //越界或者为水域,直接返回
return;
}
grid[x][y] = ; //标记已遍历过的节点
int vx[] = { , , , - }; //记录四个方向,如vx[0],vy[0],即横坐标不变,纵坐标加1,向上移动一步
int vy[] = { , , -, };
for (int i = ; i < ; i++)
{
dfs(x + vx[i],y + vy[i],grid); //遍历剩余四个方向
}
} void printGrid(vector<vector<int> > grid) { //打印二维矩阵
for (int i = ; i < grid.size(); i++)
{
for (int j = ; j < grid[].size(); j++)
{
cout << grid[i][j] << " ";
}
cout << endl;
}
} int closedIsland(vector<vector<int> > &grid)
{
int result = ;
int y = grid.size(); //一共有多少行
int x = grid[].size();
int i, j;
//从边界往里遍历,凡是能到达的所有陆地,均不能构成闭合岛屿
for (i = ; i < y; i++) {
for (j= ; j < x; j++)
{
if (i == || j == || i == y - || j == x - ) {
dfs(i, j, grid);
}
}
}
cout << "\n边界处理完成后的结果:" << endl;
printGrid(grid);
//继续遍历,剩余结点中,某个陆地x能到达的所有区域,构成一个孤岛,统计有多少个这样的x
for (i = ; i < grid.size(); i++)
{
for (j= ; j < grid[].size(); j++)
{
if (grid[i][j] == ) //起点,遍历结束后,所有可到达的点被标记为水域,即产生一个孤岛
{
result++;
dfs(i,j,grid);
}
}
}
return result;
} int main() {
vector<vector<int> > grid;
//输入二维矩阵
int m, n;
cin >> m >> n;
vector<int> temp(n); //结束临时一维数组构建二维数组
grid.resize(m,temp); //二维数组大小初始化(注意用法)
int i, j;
for (i = ; i < m; i++)
{
for (j = ; j < n;j++)
{
cin >> grid[i][j]; //输入二维数组元素
}
} cout << "\n孤岛计算结果:" << closedIsland(grid) << endl; //输出计算结果 }
运行结果:

分析:

第一步是将1,2两块区域排除,毕竟它们处于边界,不可能成为孤岛区域
第二步是找出3,4,两块区域,比如第4块,想从左上角开始深度优先遍历(当然广度也可以),岂能到达的所有陆地领域都是联通的,共同构成一个孤岛,因此,ret+1;
最后,返回结果!
Leetcode 1254. 统计封闭岛屿的数目的更多相关文章
- LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands
地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...
- asp.net——统计输入的字符数目
asp.net——统计输入的字符数目 题目: 在页面中有一个TextBox输入框,一个显示文字用的Label,一个提交按钮Button.在TextBox中输入一段英文字母,点击按钮提交后统计其中字母‘ ...
- 【LeetCode】1399. 统计最大组的数目 Count Largest Group
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接求 日期 题目地址:https://leetcod ...
- LeetCode 5216. 统计元音字母序列的数目(Java)DP
5216. 统计元音字母序列的数目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', ...
- [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 ...
- 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 ...
- linux 统计命令执行后的行数或者统计目录下文件数目
ls |wc 是统计你这个目录下的文件数目.ls |wc -l是输出第一个结果即31即文件的数目.
- LeetCode 1248. 统计「优美子数组」
地址 https://www.acwing.com/solution/leetcode/content/5801/ 题目描述给你一个整数数组 nums 和一个整数 k. 如果某个子数组中恰好有 k 个 ...
- Java实现 LeetCode 828 统计子串中的唯一字符(暴力+转数组)
828. 统计子串中的唯一字符 我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数. 例如:s = "LEETCODE" ...
随机推荐
- SSL证书格式转换
crt格式转pem openssl x509 -in www.x.com.crt -out www.x.com.pem openssl x509 -in mycert.crt -out mycert. ...
- 2019-11-29-WPF-非客户区的触摸和鼠标点击响应
原文:2019-11-29-WPF-非客户区的触摸和鼠标点击响应 title author date CreateTime categories WPF 非客户区的触摸和鼠标点击响应 lindexi ...
- git commit 统计
git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; lo ...
- spring事务概念与获取事务时事务传播行为源码分析
一.事务状态:org.springframework.transaction.TransactionStatus isNewTransaction 是否是新事务 hasSavepoint 是否有保存点 ...
- 数据库——可视化工具Navicat、pymysql模块、sql注入问题
数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...
- Centos 7 JDK 安装(默认之前没有安装过)
第一步: 安装JDK,先检查JDK是否存在,输入以下命令回车: java -version 没有安装过会显示: [root@heyouhao /]# java -version [root@heyou ...
- JavaScript之二十三种设计模式
23种JavaScript设计模式 原文链接:https://boostlog.io/@sonuton/23-javascript-design-patterns-5adb006847018500 ...
- vue工作原理分析
初始化 在 new Vue() 时会调⽤用_init()进⾏行行初始化,会初始化各种实例例⽅方法.全局⽅方法.执⾏行行⼀一些⽣生命周期. 初始化props. data等状态.其中最重要的是data的「 ...
- win中Oracle简易客户端和plsql的配置
连接数据库有2种方式:在本机安装Oracle数据库或者是安装一个oracle简易客户端 当然,简易客户端跟oracle数据库比较少了一些功能 连接方式: 1)简易连接 sqlplus scott/ti ...
- Unity 渲染教程(一):矩阵
转载:http://gad.qq.com/program/translateview/7181958 创建立方体网格.· 支持缩放.位移和旋转. · 使用变换矩阵. · 创建简单的相机投影. 这是关于 ...