华为机试 - 机器人

news2024/10/6 22:31:46

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

现有一个机器人,可放置于 M × N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可以在网格间移动。


问题: 求机器人可活动的最大范围对应的网格点数目。
说明:网格左上角坐标为 (0,0) ,右下角坐标为(m−1,n−1),机器人只能在相邻网格间上下左右移动

输入描述

第 1 行输入为 M 和 N , M 表示网格的行数 N 表示网格的列数
之后 M 行表示网格数值,每行 N 个数值(数值大小用 k 表示),
数值间用单个空格分隔,行首行尾无多余空格。
M、 N、 k 均为整数,且 1 ≤ M,N ≤ 150, 0 ≤ k ≤ 50

输出描述

输出 1 行,包含 1 个数字,表示最大活动区域的网格点数目,
行首行尾无多余空格。

用例

输入4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4
输出6
说明

 图中绿色区域,相邻网格差值绝对值都小于等于 1 ,且为最大区域,对应网格点数目为 6。

题目解析

本题其实就是求最大的连通分量,相邻网格是否连通的规则如下

当相邻网格的数字编号差值的绝对值小于等于 1 时

因此,求解连通分量,我们可以使用并查集。关于并查集的知识,请看:华为机试 - 发广播_伏城之外的博客-CSDN博客_服务器广播 华为机试

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let m, n;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    [m, n] = lines[0].split(" ").map(Number);
  }

  if (m && lines.length === m + 1) {
    lines.shift();
    const matrix = lines.map((line) => line.split(" ").map(Number));

    console.log(getResult(matrix, m, n));
    lines.length = 0;
  }
});

function getResult(matrix, m, n) {
  const ufs = new UnionFindSet(m * n);

  // 上下左右的偏移量
  const offset = [
    [-1, 0],
    [1, 0],
    [0, -1],
    [0, 1],
  ];

  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      // 注意下面这层for是常量级的,就四次循环,因此,这里的时间复杂度还是O(n*m),即
      for (let k = 0; k < offset.length; k++) {
        const [offsetX, offsetY] = offset[k];
        const newI = i + offsetX;
        const newJ = j + offsetY;
        if (newI < 0 || newI >= m || newJ < 0 || newJ >= n) continue;
        if (Math.abs(matrix[i][j] - matrix[newI][newJ]) <= 1) {
          ufs.union(i * m + j, newI * m + newJ);
        }
      }
    }
  }

  let total = m * n;

  // ufs.count是连通分量的个数,如果只有一个连通分量,那么代表所有的点都可达
  if (ufs.count === 1) return total;

  // 这个for循环是有必要的,确保每个点都指向祖先
  for (let i = 0; i < total; i++) {
    ufs.find(i);
  }

  // 统计指向同一个祖先下点的个数,即每个连通分量下的点个数
  const countObj = ufs.fa.reduce((p, c) => {
    p[c] ? p[c]++ : (p[c] = 1);
    return p;
  }, {});

  // 取最大个数
  return Math.max.apply(null, Object.values(countObj));
}

class UnionFindSet {
  constructor(n) {
    this.fa = new Array(n).fill(0).map((_, i) => i);
    this.count = n;
  }

  find(x) {
    if (x !== this.fa[x]) {
      return (this.fa[x] = this.find(this.fa[x]));
    }
    return x;
  }

  union(x, y) {
    const x_fa = this.find(x);
    const y_fa = this.find(y);

    if (x_fa !== y_fa) {
      this.fa[y_fa] = x_fa;
      this.count--;
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原生API编写简单富文本编辑器002

原生API编写简单富文本编辑器002 1. 为功能按钮添加点击事件 我们在index.js 中为所有功能按钮添加点击事件监听&#xff0c;在点击对应按钮时执行相应的原生命令。 window.onload function() {const btns document.getElementById(editorBar).getElementsByTagName(li);fo…

centos7安装xfce桌面后,桌面空白,只有openbox功能,解决办法

因为有openbox和图标桌面 两个模式 在登录时,输入密码,下一步,旁边<齿轮按钮>,选择 图标桌面,再登录 前期centos7安装xfce步骤 yum update yum install epel-release -y yum groupinstall -y “X Window system” yum grouplist //查看是否有xfce yum groupinstall -y …

ClickHouse在自助行为分析场景的实践应用

导读 公司每日产生海量数据&#xff0c;按业务需要进行统计产出各类分析报表&#xff0c;但巨大的数据量加上复杂的数据模型&#xff0c;以及个性化的分析维度&#xff0c;采用传统的离线预计算方式难以灵活支持&#xff0c;为此需引入一种满足实时多维分析场景的计算引擎框架…

Linux基础IO

基础IO&#x1f3de;️1. 系统文件I/O&#x1f4d6;1.1 接口介绍&#x1f4d6;1.2 creat系统调用&#x1f4d6;1.3 理解fd文件描述符&#x1f4d6;1.4 不按顺序的读取和写入&#x1f4d6;1.5 文件重命名&#x1f301;2. 理解Linux下一切皆文件&#x1f320;3. 理解重定向&#…

5G LAN赋能智慧工厂加速落地,四信5G工业路由器成最佳助攻

近年来&#xff0c;随着5G技术的蓬勃发展&#xff0c;信息技术与企业发展更加紧密结合已经成为未来企业发展的主要趋势。而作为“新基建”的代表&#xff0c;5G与工业网络的融合无疑成为未来5G网络的一个重要应用场景。 然而&#xff0c;在传统的工厂制造中&#xff0c;大多数设…

Java基础-面向对象综合练习-拼图游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们先来…

ADI Blackfin DSP处理器-BF533的开发详解5:PLL配置内核和系统时钟(含源代码)

又是一个熟悉的名词&#xff0c;PLL。 硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 PLL(Phase Locked Loop)是 ADSP-BF53x 的内核和时钟设置的机制&#xff0c;叫做锁相环。通过 P…

论文阅读笔记 | 三维目标检测——CenterPoint算法

如有错误&#xff0c;恳请指出。 文章目录0. 前言1. 背景2. 准备工作3. 网络结构3.1 RPN3.2 RCNN4. 实验结果paper&#xff1a;《Center-based 3D Object Detection and Tracking》&#xff08;2021CVPR&#xff09; 0. 前言 CenterPoint应该是与CenterNet是同一个团队的成果…

[附源码]Python计算机毕业设计Django在线项目管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

庄懂的TA笔记(十一)< >

庄懂的TA笔记&#xff08;十一&#xff09;&#xff1c; &#xff1e; 目录&#xff1a; 一、shader面板玩法 > 增广 : 多种 面板设计玩法&#xff1a; 二、shader参数类型 > 增广 &#xff1a;认识 多种参数类型 &#xff1a; 三、增广 &#xff1a;认识 IVO …

体验一下传说中可以干掉程序员的OpenAI ChatGPT

ChatGPT初体验 ​ OpenAI公司最近开发了一个新的聊天AI模型&#xff0c;ChatGPT。网上铺天盖地传言AI可以替代程序员。于是今天也来体验了一下。下面是一个使用的案例&#xff1a; ​ 首先看来他也不是万能的。 问&#xff1a; 今年世界杯冠军预测 ChatGPT: 对于世界杯的冠军…

【20221208】【排序专题】

一、冒泡排序&#xff08;稳定排序&#xff09; 思想&#xff1a;冒泡排序的思想就是比较当前数和后一个数的大小&#xff0c;将较大的数往后移动&#xff0c;这样可以确保一轮下来能将最大的数放在数组的最末端。然后重复此操作即可完成排序。 上面第一轮比较完&#xff0c;我…

VSCode无法远程连接VMWare(Ubuntu)其中一个可能原因(inet消失)

有时候把虚拟机挂起后&#xff0c;等自己下次再想用&#xff0c;打开vscode用之前的ssh配置&#xff0c;却始终无法连接&#xff0c;进程sshd也是开启的&#xff0c;就很纳闷。 然后么&#xff0c;咱就想查查是不是网络的问题&#xff0c;毕竟ssh是通过ipv4连的虚拟机&#xff…

【explain执行计划】MySQL性能调优

explain是MySQL性能调优过程中必须掌握的工具&#xff0c;explain结果中常见的type结果及代表的含义&#xff0c;并且通过同一个SQL语句的性能差异&#xff0c;说明建立正确的索引多么重要。 explain结果中的type字段代表什么意思&#xff1f; MySQL的官网解释非常简洁&#x…

前端埋点分析

第三方代码埋点 已经有很多成型的服务商了如友盟&#xff0c;百度统计等&#x1f32f;&#xff0c;都提供了比较成型的方案&#x1f3a8;&#xff0c;并可以在后台管理系统中查看比较详细的数据分析 自己动手 优点&#xff1a; 控制精准&#xff0c;可以非常精确地选择什么时…

Bulma的简单使用

文章目录1. 引入Bulma2. 字体和颜色3. 间距和容器1. 引入Bulma 通过 CDN 引入&#xff1a; <style>import "https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.4/css/bulma.min.css";</style>官网还有其他多种引入方式。 2. 字体和颜色 在 Bulma 中&…

基于jQuery或Zepto的图片延迟加载插件

当我们网站的页面图片过多时&#xff0c;加载速度就会很慢。尤其是用手机2G/3G访问页面&#xff0c;不仅页面慢&#xff0c;而且还会用掉很多流量。我们主题之前也都采用了图片的懒加载形式&#xff0c;但都不完美&#xff0c;部分主题还采用了占位图片来控制懒加载&#xff0c…

CP2102N高度集成USB全速带电池充电检测控制芯片

目录CP2102N简介主要特点芯片特性CP2102N开发板开发板功能应用领域CP2102N简介 CP2102N是USBXpress系列中新的一款高度集成的USB转RS232的桥接芯片。不但较上一代CP210X系列更有成本效益&#xff0c;而且在功能上也有更多创新。其中&#xff0c;符合USB-BCS 1.2规范的充电器识…

【人脸识别】基于直方梯度图 HDGG 的人脸识别算法研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步进步&#xff0c;matlab项目目标合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信息&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算…

入门系列 - Git的管理修改与撤销修改

本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目录在&#xff1a;/usr/local/git/test_rep Git的管理修改与撤销修改 在讲这个之前&#xff0c;还是有必要再阐述一下“工作区和暂存区”。Git 和其它版本控制…