华为OD机试 - 可活动的最大网格点数目 - 广度优先搜索BFS(Python/JS/C/C++ 2024 E卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

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

二、输入描述

第 1 行输入 M 和 N,M 表示网格的行数 N 表示网格的列数
之后 M 行表示网格数组,每行 N 个数值(数值为 0 到 5 之间),数值间用单个空格分隔,行与行无多余空格。

M、N、K 均为整数,且 1 ≤ M, N ≤ 150, 0 ≤ K ≤ 50

三、输出描述

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

四、测试用例

测试用例1:

1、输入

4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4

2、输出

6

3、说明

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

测试用例2:

1、输入

3 3
0 1 0
1 2 1
0 1 0

2、输出

9

3、说明

所有网格点的编号差的绝对值都不超过 1,整个网格都是一个连通区域,包含 9 个网格点。

五、解题思路

1、问题理解

给定一个 M × N 的网格,网格中的每个点有一个非负整数编号(0 到 5)。机器人可以在网格中任意放置起始点,然后在相邻的上下左右网格间移动,移动的条件是相邻网格编号的差的绝对值不超过 1。要求求出机器人在网格中可活动的最大范围,即能够到达的网格点的最大数量。

2、解决方案

为了求解这个问题,我们需要找到网格中最大的连通区域,其中相邻网格之间的编号差的绝对值不超过 1。这个问题可以转化为在图中寻找最大连通分量的问题,其中每个网格点是图中的一个节点,相邻的节点之间有边连接,前提是它们的编号差的绝对值不超过 1。

遍历网格中的每一个未被访问的点,使用 BFS 来找到与之相连的所有符合条件的点,记录下连通区域的大小,并更新最大连通区域的大小。

六、Python算法源码

# Python版本
import sys
from collections import dequedef main():# 读取所有输入input = sys.stdin.read().split()idx = 0# 读取网格的行数M和列数NM = int(input[idx])N = int(input[idx + 1])idx += 2# 初始化网格数组grid = []for _ in range(M):row = []for _ in range(N):row.append(int(input[idx]))idx += 1grid.append(row)# 初始化访问标记数组,全部设置为Falsevisited = [[False for _ in range(N)] for _ in range(M)]max_region = 0  # 记录最大连通区域的大小# 定义四个方向的移动:上、下、左、右directions = [(-1,0), (1,0), (0,-1), (0,1)]# 遍历每一个网格点for i in range(M):for j in range(N):if not visited[i][j]:# 使用BFS计算当前连通区域的大小queue = deque()queue.append((i,j))visited[i][j] = Truecount = 1while queue:x, y = queue.popleft()for dx, dy in directions:new_x = x + dxnew_y = y + dy# 判断新位置是否在网格范围内且未被访问if 0 <= new_x < M and 0 <= new_y < N and not visited[new_x][new_y]:# 判断编号差的绝对值是否小于等于1if abs(grid[x][y] - grid[new_x][new_y]) <= 1:queue.append((new_x, new_y))visited[new_x][new_y] = Truecount += 1# 更新最大连通区域的大小if count > max_region:max_region = count# 输出结果print(max_region)if __name__ == "__main__":main()

七、JavaScript算法源码

// JavaScript版本
const readline = require('readline');// 创建接口以逐行读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let input = [];
rl.on('line', function(line){input = input.concat(line.trim().split(' '));
}).on('close', function(){let idx = 0;// 读取网格的行数M和列数Nconst M = parseInt(input[idx++]);const N = parseInt(input[idx++]);// 初始化网格数组let grid = [];for(let i = 0; i < M; i++){let row = [];for(let j = 0; j < N; j++){row.push(parseInt(input[idx++]));}grid.push(row);}// 初始化访问标记数组,全部设置为falselet visited = Array.from({length: M}, () => Array(N).fill(false));let maxRegion = 0; // 记录最大连通区域的大小// 定义四个方向的移动:上、下、左、右const directions = [[-1, 0],[1, 0],[0, -1],[0, 1]];// 遍历每一个网格点for(let i = 0; i < M; i++){for(let j = 0; j < N; j++){if(!visited[i][j]){// 使用BFS计算当前连通区域的大小let queue = [];queue.push([i, j]);visited[i][j] = true;let count = 1;while(queue.length > 0){let [x, y] = queue.shift();for(let dir = 0; dir < directions.length; dir++){let newX = x + directions[dir][0];let newY = y + directions[dir][1];// 判断新位置是否在网格范围内且未被访问if(newX >=0 && newX < M && newY >=0 && newY < N && !visited[newX][newY]){// 判断编号差的绝对值是否小于等于1if(Math.abs(grid[x][y] - grid[newX][newY]) <= 1){queue.push([newX, newY]);visited[newX][newY] = true;count++;}}}}// 更新最大连通区域的大小if(count > maxRegion){maxRegion = count;}}}}// 输出结果console.log(maxRegion);
});

八、C算法源码

/* C语言版本 */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 定义队列结构
typedef struct {int x;int y;
} Point;// 定义队列大小
typedef struct {Point *data;int front;int rear;int size;
} Queue;// 初始化队列
Queue* createQueue(int max_size){Queue *q = (Queue*)malloc(sizeof(Queue));q->data = (Point*)malloc(sizeof(Point)*max_size);q->front = 0;q->rear = 0;q->size = max_size;return q;
}// 判断队列是否为空
bool isEmpty(Queue *q){return q->front == q->rear;
}// 入队
void enqueue(Queue *q, int x, int y){q->data[q->rear].x = x;q->data[q->rear].y = y;q->rear = (q->rear + 1) % q->size;
}// 出队
Point dequeue(Queue *q){Point p = q->data[q->front];q->front = (q->front + 1) % q->size;return p;
}int main(){int M, N;// 读取网格的行数M和列数Nscanf("%d %d", &M, &N);// 动态分配网格数组int **grid = (int**)malloc(sizeof(int*)*M);for(int i = 0; i < M; i++){grid[i] = (int*)malloc(sizeof(int)*N);for(int j = 0; j < N; j++){scanf("%d", &grid[i][j]);}}// 初始化访问标记数组,全部设置为falsebool **visited = (bool**)malloc(sizeof(bool*)*M);for(int i = 0; i < M; i++){visited[i] = (bool*)malloc(sizeof(bool)*N);for(int j = 0; j < N; j++){visited[i][j] = false;}}int max_region = 0; // 记录最大连通区域的大小// 定义四个方向的移动:上、下、左、右int dx[4] = {-1, 1, 0, 0};int dy[4] = {0, 0, -1, 1};// 创建队列,最大可能大小为M*NQueue *q = createQueue(M*N);// 遍历每一个网格点for(int i = 0; i < M; i++){for(int j = 0; j < N; j++){if(!visited[i][j]){// 使用BFS计算当前连通区域的大小enqueue(q, i, j);visited[i][j] = true;int count = 1;while(!isEmpty(q)){Point p = dequeue(q);int x = p.x;int y = p.y;for(int dir = 0; dir < 4; dir++){int new_x = x + dx[dir];int new_y = y + dy[dir];// 判断新位置是否在网格范围内且未被访问if(new_x >=0 && new_x < M && new_y >=0 && new_y < N && !visited[new_x][new_y]){// 判断编号差的绝对值是否小于等于1if(abs(grid[x][y] - grid[new_x][new_y]) <= 1){enqueue(q, new_x, new_y);visited[new_x][new_y] = true;count++;}}}}// 更新最大连通区域的大小if(count > max_region){max_region = count;}}}}// 输出结果printf("%d\n", max_region);// 释放内存for(int i = 0; i < M; i++) {free(grid[i]);free(visited[i]);}free(grid);free(visited);free(q->data);free(q);return 0;
}

九、C++算法源码

// C++版本
#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0);int M, N;// 读取网格的行数M和列数Ncin >> M >> N;// 初始化网格数组vector<vector<int>> grid(M, vector<int>(N));for(int i = 0; i < M; i++){for(int j = 0; j < N; j++){cin >> grid[i][j];}}// 初始化访问标记数组,全部设置为falsevector<vector<bool>> visited(M, vector<bool>(N, false));int max_region = 0; // 记录最大连通区域的大小// 定义四个方向的移动:上、下、左、右int dx[4] = {-1, 1, 0, 0};int dy[4] = {0, 0, -1, 1};// 遍历每一个网格点for(int i = 0; i < M; i++){for(int j = 0; j < N; j++){if(!visited[i][j]){// 使用BFS计算当前连通区域的大小queue<pair<int, int>> q;q.push({i, j});visited[i][j] = true;int count = 1;while(!q.empty()){pair<int, int> p = q.front();q.pop();int x = p.first;int y = p.second;for(int dir = 0; dir < 4; dir++){int new_x = x + dx[dir];int new_y = y + dy[dir];// 判断新位置是否在网格范围内且未被访问if(new_x >=0 && new_x < M && new_y >=0 && new_y < N && !visited[new_x][new_y]){// 判断编号差的绝对值是否小于等于1if(abs(grid[x][y] - grid[new_x][new_y]) <= 1){q.push({new_x, new_y});visited[new_x][new_y] = true;count++;}}}}// 更新最大连通区域的大小if(count > max_region){max_region = count;}}}}// 输出结果cout << max_region;return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++打怪之路Lv6】-- 内存管理

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

【重学 MySQL】五十一、更新和删除数据

【重学 MySQL】五十一、更新和删除数据 更新数据删除数据注意事项 在MySQL中&#xff0c;更新和删除数据是数据库管理的基本操作。 更新数据 为了更新&#xff08;修改&#xff09;表中的数据&#xff0c;可使用UPDATE语句。UPDATE语句的基本语法如下&#xff1a; UPDATE ta…

[Python学习日记-33] Python 中的嵌套函数、匿名函数和高阶函数

[Python学习日记-33] Python 中的嵌套函数、匿名函数和高阶函数 简介 嵌套函数 匿名函数 高阶函数 简介 在 Python 当中函数除了能减少重复代码、扩展性强和易维护外&#xff0c;其实还有挺多不通的玩法的&#xff0c;例如嵌套函数、匿名函数、高阶函数等&#xff0c;它们是…

C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验

一、预览效果 国庆节第一天,祝祖国繁荣昌盛! 1.1 效果图 (WinForm无边框窗体,F11可全屏) 拖动窗体时半透明效果(拖动时参考窗体后面释放位置) 说明:本功能的实现基于网友的原型完善而来,更多代码可以参考他的文章 h

图解大模型计算加速系列:vLLM源码解析3,Prefix Caching

【全文目录如下】 一、两种不同的BlockAllocator 二、物理块和逻辑块的结构 三、prefill阶段的物理块分配方法 3.1 allocate函数入口 3.2 计算物理块hash值的方法 3.3 使用LRUEvictor管理物理块分配细节 3.4 再探LRUEvictor&#xff0c;理解“prefix” …

Elasticsearch学习记录

阅读前须知 本文通过安装elasticsearch-7.17.0为基础&#xff0c;使用 kibana-7.17.0 对 elasticsearch 进行操作&#xff0c;本文中 es 是对 elasticsearch 的简写。 下载地址&#xff1a;elasticsearch_免费高速下载|百度网盘-分享无限制 (baidu.com) 1 初识Elasticsearch …

阿里巴巴开源的FastJson 1反序列化漏洞复现攻击保姆级教程

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关FastJson1反序列化漏洞的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在…

【重学 MySQL】四十五、数据库的创建、修改与删除

【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…

Ubuntu安装Hadoop3.4

1、创建Hadoop用户 sudo adduser hadoop 将Hadoop加进sudo用户组,赋予更高权限: sudo usermod -G sudo hadoop 3、安装JDK(略) 查看JDK安装路径:which java 和 ls -al 3、配置SSH免密登录 在Hadoop分布式集群环境中,各个机器之间的通信通常需要使用SSH的方式进行连…

探索Python网络世界的利器:Requests-HTML库

文章目录 探索Python网络世界的利器&#xff1a;Requests-HTML库背景&#xff1a;为何选择Requests-HTML&#xff1f;什么是Requests-HTML&#xff1f;如何安装Requests-HTML&#xff1f;5个简单库函数的使用方法3个场景下库的使用示例常见Bug及解决方案总结 探索Python网络世界…

【多线程】多线程(8):单例模式:阻塞队列

【阻塞队列】 阻塞队列是在普通的“先进先出”队列的基础上&#xff0c;做出了扩充&#xff0c;可以组成「生产者消费者模型」 1.线程安全性 标准库是原有的队列Queue和其子类&#xff0c;默认都是“线程不安全的”&#xff0c;而阻塞队列是“线程安全的” 2.具有阻塞特性 …

基于STM32的智能风扇控制系统设计

引言 本项目将基于STM32微控制器设计一个智能风扇控制系统&#xff0c;通过温度传感器实时检测环境温度&#xff0c;并根据预设的温度范围自动调节风扇的转速。该系统展示了STM32的PWM输出、传感器接口以及自动控制应用的实现。 环境准备 1. 硬件设备 STM32F103C8T6 开发板…

Java | Leetcode Java题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…

51单片机的宠物自动投喂系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块蓝牙步进电机按键、蜂鸣器等模块构成。适用于猫猫/狗狗宠物自动喂食器等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间和温湿度 2、温湿度传感器DHT11采集环境温湿度 3、时…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密码 一…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

828华为云征文|部署音乐流媒体服务器 mStream

828华为云征文&#xff5c;部署音乐流媒体服务器 mStream 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 mStream3.1 mStream 介绍3.2 mStream 部署3.3 mStream 使用 四、…

【MySQL】Ubuntu环境下MySQL的安装与卸载

目录 1.MYSQL的安装 2.MYSQL的卸载 1.MYSQL的安装 首先我们要看看我们环境里面有没有已经安装好的MySQL 我们发现是默认是没有的。 我们还可以通过下面这个命令来确认有没有mysql的安装包 首先我们得知道我们当前的系统版本是什么 lsb_release -a 我们在找apt源的时候&a…

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时永不休眠的步骤

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时永不休眠的步骤 2024/10/4 19:22 1、 Z:\rk3588s4_3588a12\device\rockchip\common\device.mk ifeq ($(strip $(BOARD_HAVE_BLUETOOTH_RTK)), true) include hardware/realtek/rtkbt/rtkbt.mk endif ifeq ($(str…

【文件增量备份系统】MySQL百万量级数据量分页查询性能优化

&#x1f3af; 导读&#xff1a;本文针对大数据量下的分页查询性能问题进行了深入探讨与优化&#xff0c;最初查询耗时长达12秒&#xff0c;通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟&#xff0c;采用先查询倒数第N条记录…