给定一个二维 0-1 矩阵,其中 1 表示陆地,0 表示海洋,每个位置与上下左右相连。已知矩阵中有且只有两个岛屿,求最少要填海造陆多少个位置才可以将两个岛屿相连。
输入是一个二维整数数组,输出是一个非负整数,表示需要填海造陆的位置数。

function func(arr) {// n * n 的地图const n = arr.length;const nums = [-1, 0, 1, 0, -1];const visited = [];for (let i = 0; i < n; ++i) {visited[i] = new Array(n).fill(false);}// 获取岛屿的范围const _getLandArea = (i, j, land) => {// 数组越界或非陆地或已经计算过,退出if (i < 0 || i >= n || j < 0 || j >= n || arr[i][j] != 1 || visited[i][j]) {return;}// 标记当前位置为已计算visited[i][j] = true;land.push({ x: i, y: j });// 当前坐标尝试向四个方位拓展for (let k = 0; k < 4; ++k) {_getLandArea(i + nums[k], j + nums[k + 1], land);}};// 寻找岛屿const _getLand = () => {const land = [];// 标识此次是否已寻找到岛屿let findLand = false;// 尝试获取岛屿for (let i = 0; i < n; ++i) {for (let j = 0; j < n; ++j) {// 如果是岛屿且未计算过if (arr[i][j] == 1 && !visited[i][j]) {// 获取该岛屿的范围_getLandArea(i, j, land);findLand = true;break;}}// 此次已寻找到岛屿,退出if (findLand) {break;}}return land;};// 岛屿Aconst landA = _getLand();// 岛屿Bconst landB = _getLand();/*** 计算两个岛屿之间的最短路径,即判断其中两个点 a (x1, y1)和 b (x2, y2) 的最短距离* 因为不能斜着走,所以应该是计算边长* 即 step = 长 + 宽 = Math.abs(x1 - x2) + Math.abs(y1 - y2) - 1*/let minStep = Infinity;for (let i = 0; i < landA.length; ++i) {for (let j = 0; j < landB.length; ++j) {const step = Math.abs(landA[i].x - landB[j].x) + Math.abs(landA[i].y - landB[j].y) - 1;minStep = Math.min(minStep, step);}}return { landA, landB, step: minStep };
}const arr = [[ 1, 0, 0, 0, 0 ],[ 0, 0, 0, 1, 0 ],[ 0, 0, 1, 1, 0 ],[ 0, 0, 1, 1, 0 ],[ 0, 0, 0, 0, 0 ],
];
const result = func(arr);console.log(result);

给定一个二维 0-1 矩阵,其中 1 表示陆地,0 表示海洋,每个位置与上下左右相连。已知矩阵中有且只有两个岛屿,求最少要填海造陆多少个位置才可以将两个岛屿相连。相关推荐

  1. 给定一个二维的 0-1 矩阵,其中 0 表示海洋,1 表示陆地。单独的或相邻的陆地可以形成岛屿,每个格子只与其上下左右四个格子相邻。求最大的岛屿面积。

    给定一个二维的 0-1 矩阵,其中 0 表示海洋,1 表示陆地.单独的或相邻的陆地可以形成岛屿,每个格子只与其上下左右四个格子相邻.求最大的岛屿面积. function func(arr) {/*** ...

  2. 单词搜索:给定一个二维网格和一个单词,找出该单词是否存在于网格中java实现

    题目描述 https://leetcode-cn.com/problems/word-search 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的 ...

  3. 单词搜索(给定一个二维网格和一个单词,找出该单词是否存在于网格中)

    力扣 从二维数组中找字符串是否存在,而且同一个元素不能重复使用.这是字符串匹配类型题目,要记住方法.将二维数组简化成字符串,也就是字符串匹配了(依次遍历每个元素,将其当做开头,开始匹配). 1.可以想 ...

  4. LeetCode149. 直线上最多的点数: 给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o ±------- ...

  5. 给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    需求:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 分析思路: 1.将所有点二维坐标化,即定义出所有点的x,y坐标值 2.遍历出所有取出两点的情况(不考虑先后顺序),根据任意 ...

  6. DFS之最大人工岛(填海造陆) 827.

    #include <iostream> using namespace std; // 最大人工岛 力扣 827. // 思路:第一遍遍历找陆地dfs染色并记录每个板块面积,记录最大板块面 ...

  7. C++:给定一个二维点集,找到所有的整体对称轴

    这里我列出了两种方法: 1.基于质心的解法.(这种方法要求除非你拥有"分数"的数据结构,不然质心的求解会出现误差) 2.基于向量的解法. 该算法的核心思想是:先求出凸包,凸包的对称 ...

  8. c语言二维数组输入数据,c语言编写程序,把下面的数据输入到一个二维数组中:...

    c语言编写程序,把下面的数据输入到一个二维数组中: 答案:3  信息版本:手机版 解决时间 2019-10-07 01:08 已解决 2019-10-06 03:19 1. 编写程序,把下面的数据输入 ...

  9. python求二维数组各行最大值_python+numpy按行求一个二维数组的最大值方法

    问题描述: 给定一个二维数组,求每一行的最大值 返回一个列向量 如: 给定数组[1,2,3:4,5,3] 返回[3:5] import numpy as np x = np.array([[1,2,3 ...

最新文章

  1. linux yum localinstall 解决本地rpm包的依赖问题
  2. zerodivisionerror什么意思python-Python 中的 else详解
  3. 【数据平台】关于Hadoop集群namenode format安全事故
  4. cryptogen (1)generate 生成证书举例
  5. C++ 基础知识!初学者必看!
  6. 数据分析师经常遇到的13个问题
  7. 如何修改 SAP 登录界面的文字(事务码SE61)
  8. ezmorph-1.0.6.jar的作用
  9. RabbitMQ 高可用之镜像队列
  10. 程序员“不会”修电脑的原因
  11. 易优CMS:arcview的基础用法
  12. 一、显示VOC2007数据集中的图像及标注信息
  13. 我看过的机器学习方面的好文章
  14. Python功能实现:为pdf电子书籍生成书签目录
  15. android 渐变蒙版_PPT教程 | 渐变蒙版
  16. matlab 数据白化,数据白化
  17. 腾讯2021校园招聘编程题
  18. 弗兰克赫兹大物实验数据处理
  19. 英雄联盟一直连接不上服务器连接异常,lol服务器连接异常 英雄联盟老是与客户端失去连接...
  20. 给定divId,滚动条滚到相应位置

热门文章

  1. 启用tim无法访问文件夹_如何在三星手机上启用安全文件夹
  2. qt可视化读取_生成_编辑_联动_保存目录树
  3. 《熊猫人之谜》增益效果与减益效果设计
  4. JavaScript笔记6(数组,foreach(),slice(),splice(),数组的剩余方法,函数的方法call和apply ,arguments,Date对象,Math,字符串的相关方法)
  5. 这世上没有什么是理所当然的
  6. Keychron键盘—一款办公利器
  7. 软件架构师扮演的是角色,提供沟通的实用技巧
  8. 安全应急漏洞排查思路
  9. Java 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
  10. 家族信托二十大功能全解读