华为OD机试 - 需要打开多少监控器(Python/JS/C/C++ 2024 E卷 100分)

ops/2024/9/22 16:25:25/

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

在一长方形停车场内,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开。给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器。

二、输入描述

第一行输入 m,n 表示长宽,满足 1 < m, n <= 20;

后面输入 m 行,每行有 n 个 0 或 1 的整数,整数间使用一个空格隔开,表示该行停车情况,其中 0 表示空位,1 表示已停。

三、输出描述

最少需要打开监控器的数量。

四、测试用例

测试用例1

1、输入

3 3
0 0 0
0 1 0
0 0 0

2、输出

5

测试用例2

1、输入

3 3
1 0 0
0 1 0
0 0 0

2、输出

6

五、解题思路

对于每一个车位,检查其自身和四个相邻方向的车位是否有车辆停放(即是否有 1)。

如果满足条件,则计数该监控器需要开启。

在检查相邻车位时,需要确保不超出矩阵的边界,以避免数组越界错误。

六、Python算法源码

python">def count_cameras(m, n, parking_lot):"""统计最少需要开启的监控器数量。:param m: 矩阵的行数:param n: 矩阵的列数:param parking_lot: 停车场的二维列表,0表示空位,1表示已停车辆:return: 最少需要开启的监控器数量"""# 定义四个方向:上、下、左、右directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]camera_count = 0  # 初始化监控器开启数量for i in range(m):for j in range(n):# 检查当前车位或四个相邻方向是否有车辆停放if parking_lot[i][j] == 1:camera_count += 1  # 当前车位有车辆,监控器需要开启else:# 检查四个相邻方向for dx, dy in directions:ni, nj = i + dx, j + dy  # 相邻车位的坐标if 0 <= ni < m and 0 <= nj < n:if parking_lot[ni][nj] == 1:camera_count += 1  # 相邻车位有车辆,监控器需要开启break  # 只需满足一个方向即可,不需继续检查return camera_countdef main():import sys# 读取所有输入lines = sys.stdin.read().strip().split('\n')if len(lines) < 1:print("-1")return# 读取第一行,解析m和nfirst_line = lines[0].strip()try:m, n = map(int, first_line.split())except:print("-1")return# 验证m和n的范围if not (1 < m <= 20) or not (1 < n <= 20):print("-1")return# 检查是否有足够的停车分布行if len(lines) != m + 1:print("-1")returnparking_lot = []for i in range(1, m + 1):try:row = list(map(int, lines[i].strip().split()))if len(row) != n:print("-1")return# 验证每个车位的值for val in row:if val not in [0, 1]:print("-1")returnparking_lot.append(row)except:print("-1")return# 计算最少需要开启的监控器数量result = count_cameras(m, n, parking_lot)print(result)if __name__ == "__main__":main()

七、JavaScript算法源码

javascript">function countCameras(m, n, parkingLot) {/*** 统计最少需要开启的监控器数量。* @param {number} m - 矩阵的行数* @param {number} n - 矩阵的列数* @param {number[][]} parkingLot - 停车场的二维数组,0表示空位,1表示已停车辆* @returns {number} 最少需要开启的监控器数量*/// 定义四个方向:上、下、左、右const directions = [[-1, 0], // 上[1, 0],  // 下[0, -1], // 左[0, 1]   // 右];let cameraCount = 0; // 初始化监控器开启数量for (let i = 0; i < m; i++) {for (let j = 0; j < n; j++) {if (parkingLot[i][j] === 1) {cameraCount += 1; // 当前车位有车辆,监控器需要开启} else {// 检查四个相邻方向for (let [dx, dy] of directions) {const ni = i + dx;const nj = j + dy;// 确保相邻车位在矩阵范围内if (ni >= 0 && ni < m && nj >= 0 && nj < n) {if (parkingLot[ni][nj] === 1) {cameraCount += 1; // 相邻车位有车辆,监控器需要开启break; // 只需满足一个方向即可,跳出循环}}}}}}return cameraCount; // 返回监控器开启数量
}function main() {const fs = require('fs'); // 引入文件系统模块const input = fs.readFileSync('/dev/stdin', 'utf8'); // 读取标准输入const lines = input.trim().split('\n'); // 按行分割输入if (lines.length < 1) {console.log("-1");return;}// 读取第一行,解析m和nconst firstLine = lines[0].trim();const mn = firstLine.split(' ');if (mn.length !== 2) { // 确保有两个数字console.log("-1");return;}const m = parseInt(mn[0]);const n = parseInt(mn[1]);// 验证m和n的范围if (isNaN(m) || isNaN(n) || m <= 1 || m > 20 || n <=1 || n >20) {console.log("-1");return;}// 检查是否有足够的停车分布行if (lines.length !== m +1) {console.log("-1");return;}const parkingLot = [];for (let i =1; i <= m; i++) {const rowStr = lines[i].trim();const row = rowStr.split(' ').map(Number);if (row.length !== n) { // 每行必须有n个分数console.log("-1");return;}// 验证每个车位的值for (let val of row) {if (val !==0 && val !==1) {console.log("-1");return;}}parkingLot.push(row);}// 计算最少需要开启的监控器数量const result = countCameras(m, n, parkingLot);console.log(result);
}// 执行主函数
main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>// 定义方向数组,表示上、下、左、右
int directions[4][2] = {{-1, 0}, // 上{1, 0},  // 下{0, -1}, // 左{0, 1}   // 右
};int main() {int m, n;// 读取第一行,获取m和nif (scanf("%d %d", &m, &n) != 2) {printf("-1\n");return 0;}// 验证m和n的范围if (m <= 1 || m > 20 || n <=1 || n >20) {printf("-1\n");return 0;}// 动态分配二维数组int parking_lot[m][n];// 读取停车分布for (int i =0; i < m; i++) {for (int j =0; j < n; j++) {if (scanf("%d", &parking_lot[i][j]) !=1) {printf("-1\n");return 0;}// 验证车位值if (parking_lot[i][j] !=0 && parking_lot[i][j] !=1) {printf("-1\n");return 0;}}}int camera_count =0; // 初始化监控器开启数量// 遍历每个车位for (int i =0; i < m; i++) {for (int j =0; j < n; j++) {if (parking_lot[i][j] ==1) {camera_count +=1; // 当前车位有车辆,监控器需要开启}else {// 检查四个相邻方向for (int d =0; d <4; d++) {int ni = i + directions[d][0];int nj = j + directions[d][1];// 确保相邻车位在矩阵范围内if (ni >=0 && ni < m && nj >=0 && nj < n) {if (parking_lot[ni][nj] ==1) {camera_count +=1; // 相邻车位有车辆,监控器需要开启break; // 只需满足一个方向即可,跳出循环}}}}}}// 输出监控器开启数量printf("%d\n", camera_count);return 0;
}

九、C++算法源码

#include <iostream>
#include <vector>
using namespace std;// 定义方向数组,表示上、下、左、右
const int directions[4][2] = {{-1, 0}, // 上{1, 0},  // 下{0, -1}, // 左{0, 1}   // 右
};int main(){ios::sync_with_stdio(false); // 关闭同步,提高IO效率cin.tie(0); // 取消cin的绑定int m, n;// 读取第一行,获取m和nif(!(cin >> m >> n)){cout << "-1\n";return 0;}// 验证m和n的范围if(m <=1 || m >20 || n <=1 || n >20){cout << "-1\n";return 0;}// 初始化停车场二维向量vector<vector<int>> parking_lot(m, vector<int>(n, 0));// 读取停车分布for(int i =0; i <m; i++){for(int j =0; j <n; j++){if(!(cin >> parking_lot[i][j])){cout << "-1\n";return 0;}// 验证车位值if(parking_lot[i][j] !=0 && parking_lot[i][j] !=1){cout << "-1\n";return 0;}}}int camera_count =0; // 初始化监控器开启数量// 遍历每个车位for(int i =0; i <m; i++){for(int j =0; j <n; j++){if(parking_lot[i][j] ==1){camera_count +=1; // 当前车位有车辆,监控器需要开启}else{// 检查四个相邻方向for(int d =0; d <4; d++){int ni = i + directions[d][0];int nj = j + directions[d][1];// 确保相邻车位在矩阵范围内if(ni >=0 && ni <m && nj >=0 && nj <n){if(parking_lot[ni][nj] ==1){camera_count +=1; // 相邻车位有车辆,监控器需要开启break; // 只需满足一个方向即可,跳出循环}}}}}}// 输出监控器开启数量cout << camera_count << "\n";return 0;
}

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

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

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

在这里插入图片描述


http://www.ppmy.cn/ops/114320.html

相关文章

网络安全:建筑公司会计软件遭受暴力攻击

黑客正在暴力破解基金会会计服务器上高权限账户的密码&#xff0c;这些账户广泛用于建筑行业&#xff0c;从而侵入企业网络。 这一恶意活动最先被 Huntress 发现&#xff0c;其研究人员于 2024 年 9 月 14 日检测到了此次攻击。 Huntress 已经发现这些攻击对管道、暖通空调、…

Flask-JWT-Extended登录验证

1. 介绍 """安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&…

如何在windows中使用mac,要详细的教程

在 Windows 上运行 macOS 需要使用虚拟机软件。以下是一个详细的教程&#xff0c;展示如何在 Windows 上安装和运行 macOS&#xff1a; 前提条件 硬件要求&#xff1a; 64 位处理器&#xff0c;支持虚拟化技术&#xff08;VT-x 或 AMD-V&#xff09;。至少 8GB 内存&#xff0…

华为地图服务功能概览 -- HarmonyOS自学7

华为地图服务式Harmony OS生态下的一个地图服务&#xff0c;为开发者提供强大而便捷的地图能力&#xff0c;助力全球开发者实现个性化地图呈现&#xff0c;地图搜索和路线规划功能。 主要包括七大功能&#xff1a;静态图&#xff0c;场景化控件&#xff0c;地点搜索&#xff0c…

C++ 元编程

目录 C 元编程1. 术语2. 元函数1. 数值元函数示例&#xff1a;阶乘计算 2. 类型元函数示例&#xff1a;类型选择 3. 混合编程1. 常规的计算点积范例2. 混合元编程计算点积 4. typelist实现设计和基本操作接口&#xff08;算法&#xff09;完整代码 5. tuple 实现基础知识1. 左值…

全国职业院校技能大赛(大数据赛项)-平台搭建hive笔记

在大数据时代&#xff0c;数据量呈爆炸性增长&#xff0c;传统的数据处理工具已难以满足需求。Hive作为一个开源的数据仓库工具&#xff0c;能够处理大规模数据集&#xff0c;提供了强大的数据查询和分析能力&#xff0c;是大数据学习中的关键工具。在全国职业院校技能大赛&…

李宏毅机器学习2023HW12—Reinforcement Learning强化学习

文章目录 TaskBaselineSimpleMedium Baseline—Policy GradientStrong Baseline——Actor-CriticBoss Baseline—Mask Task 实现深度强化学习方法: Policy GradientActor-Critic 环境&#xff1a;月球着陆器 Baseline Simple 定义优势函数(Advantage function)为执行完ac…

关于wordPress中的用户登录注册等问题

前言 大家在做类似的功能的时候&#xff0c;有没有相关的疑问。那就是我都已经选择好了相应的主题和模版&#xff0c;但是为什么都没有用户注册和用户登录的页面存在呢&#xff1f; WordPress默认情况下不提供用户注册和登录功能的原因是它最初是作为一个博客平台开发的&…