华为OD机试 -图像物体的边界(C++ Java JavaScript Python)

这篇博客介绍了华为OD统一考试B卷的最新题库情况,重点讨论了如何在二维数组中计算像素1代表的物体边界个数。题目要求找出与像素5相邻的像素1的边界,并考虑8个方向的相邻关系。文章提供了C++、JavaScript、Java和Python的解题示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。

像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,右下)。

其他约束

地图规格约束为:

0<M<100
0<N<100

1)如下图,与像素5的格子相邻的像素1的格子(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)、(4,4)、(4,5)、(5,4)为边界,另(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)相邻,为1个边界,(4,4)、(4,5)、(5,4)相邻,为1个边界,所以下图边界个数为2。

image-20230403212929835

2)如下图,与像素5的格子相邻的像素1的格子(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)、(3,3)、(3,4)、(3,5)、(4,3)、(4,5)、(5,3)、(5,4)、(5,5)为边界,另这些边界相邻,所以下图边界个数为1。

image-20230403212911541

注:(2,2)、(3,3)相邻。

输入描述

第一行,行数M,列数N

第二行开始,是M行N列的像素的二维数组,仅包含像素1和5

输出描述

像素1代表的物体的边界个数。

如果没有边界输出0(比如只存在像素1,或者只存在像素5)。

用例

输入 6 6
1 1 1 1 1 1
1 5 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 5
输出 2
说明 参考题目描述部分
输入 6 6
1 1 1 1 1 1
1 5 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
### 华为OD中的计算题目解答方法 对于华为OD中的计算类题目,通常涉及算法设计、数据结构应用以及性能优化等方面。为了提高解题效率并确保代码质量,在准备过程中应注重以下几个方面: #### 1. 理解题目背景与需求 仔细阅读题目描述,明确输入输出格式及约束条件。理解业务场景有助于构建更贴近实际应用场景的解决方案。 #### 2. 设计算法框架 基于问题特点选择合适的算法策略,如贪心算法、动态规划等,并考虑时间空间复杂度的要求[^1]。 #### 3. 数据结构的选择 合理选用合适的数据结构来存储中间结果或辅助处理逻辑,比如哈希表用于快速查找、栈队列支持先进先出/后进先出操作等。 #### 4. 边界情况测 编写程序前思考可能出现的各种边界状况,包括但不限于极端数值、特殊字符集等情况下的表现形式;这一步骤可以有效减少提交后的错误次数。 #### 5. 多语言实现练习 熟悉多种主流编程语言(C&C++&Java&Python&JS),针对同一道题目尝不同语法风格下的编码实践,从而加深对核心概念的理解程度。 下面给出一道典型的计算型样例——最大子数组问题(Maximum Subarray Problem)及其对应的多语言版本解答方案作为示范: #### 题目描述: 给定一个整数类型的数组`nums`,找到其中连续的一个子数组(至少包含一个数字),使得该子数组内的元素之达到最大值,返回这个最大的。 #### 思路分析: 采用Kadane's Algorithm解决此问题,这是一种经典的线性扫描方式,能够在O(n)时间内完成求解过程。具体做法是从左至右遍历整个序列,维护当前累加的最大值sum以及全局最优解max_sum两个变量,每当遇到负数时重置局部累积量以避免影响后续可能存在的更大正值区间贡献。 ```c++ // C++ Version int maxSubArray(vector<int>& nums) { int sum = 0; int max_sum = INT_MIN; for (auto num : nums){ sum += num; if(sum > max_sum) max_sum = sum; if(sum < 0) sum = 0; } return max_sum; } ``` ```java // Java Version public static int maxSubArray(int[] nums) { int sum = 0,max_sum=Integer.MIN_VALUE; for(int i=0;i<nums.length;i++){ sum+=nums[i]; if(max_sum<sum) max_sum=sum; if(sum<0) sum=0; } return max_sum; } ``` ```python # Python Version def max_sub_array(nums): sum_ = 0 max_sum = float('-inf') for num in nums: sum_ += num if sum_ > max_sum: max_sum = sum_ if sum_ < 0: sum_ = 0 return max_sum ``` ```javascript // JavaScript Version function maxSubArray(nums) { let sum = 0, maxSum = -Infinity; for(let num of nums){ sum += num; if(sum > maxSum) maxSum = sum; if(sum < 0) sum = 0; } return maxSum; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值