华为OD机试统一考试D卷C卷 - 多段线数据压缩(C++ Java JavaScript Python C语言)

本文介绍了华为OD机考中的一道数据压缩问题,涉及多段线简化。通过判断拐点来压缩坐标列表,保证输出顺序不变。提供了C++、Java、JavaScript、Python和C语言的解题思路及代码示例。
摘要由CSDN通过智能技术生成

华为OD机考:OD统一考试D卷+C卷+A卷+B卷+刷题OJ

真题目录:华为OD机考机试 真题目录( D卷 +C卷 + B卷 + A卷) + 考点说明
在线OJ:点击立即刷题,模拟真实机考环境
华为OD面试真题精选:华为OD面试真题精选

题目描述

下图中,每个方块代表一个像素,每个像素用其行号和列号表示。为简化处理,多段线的走向只能是水平、竖直、斜向45度。

image-20231210160526758

上图中的多段线可以用下面的坐标串表示:(2, 8), (3, 7), (3, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 3), (8, 4), (7, 5)。

但可以发现,这种表示不是最简的,其实只需要存储6个蓝色的关键点即可,它们是线段的起点、拐点、终点,而剩下4个点是冗余的。

即可以简化为:(2,8)、(3,7)、(3,5)、(6,2)、(8,4)、(7,5)

现在,请根据输入的包含有冗余数据的多段线坐标列表,输出其最简化的结果。

输入描述

2 8 3 7 3 6 3 5 4 4 5 3 6 2 7 3 8 4 7 5

1、所有数字以空格分隔,每两个数字一组,第一个数字是行号,第二个数字是列号;

2、行号和列号范围为[0,64),用例输入保证不会越界,考生不必检查;

3、输入数据至少包含两个坐标点。

输出描述

2 8 3 7 3 5 6 2 8 4 7 5

压缩后的最简化坐标列表,和输入数据的格式相同。

备注: 输出的坐标相对顺序不能变化。

用例

输入

2 8 3 7 3 6 3 5 4 4 5 3 6 2 7 3 8 4 7 5

输出

2 8 3 7 3 5 6 2 8 4 7 5

说明

如上图所示,6个蓝色像素的坐标依次是(2,8)、(3,7)、(3,5)、(6,2)、(8,4)、(7,5)。

解题思路

遍历输入的坐标点列表,对于每个当前考察的点 curr,检查它是否是拐点。为此,比较它与前一个点 prev 以及后一个点 next 形成的两个向量。如果这两个向量不共线(即它们的叉积不为零),则当前点是一个拐点。

向量和向量的叉积&

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用Python和OpenCV库实现将图片中的非水平和竖直线条变得水平和竖直的示例代码: ```python import cv2 import numpy as np # 读取图片 img = cv2.imread('input_image.jpg') # 灰度化 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray,50,150,apertureSize = 3) # 检测直线 lines = cv2.HoughLines(edges,1,np.pi/180,200) # 计算直线角度 angles = [] for line in lines: for rho,theta in line: if (theta < (np.pi/4.)) or (theta > (3.*np.pi/4.0)): # 垂直线 angle = np.degrees(theta) - 90.0 else: # 水平线 angle = np.degrees(theta) angles.append(angle) # 计算旋转角度 median_angle = np.median(angles) print("旋转角度:", median_angle) # 旋转图像 rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 先将图像旋转90度 (h, w) = rotated.shape[:2] center = (w / 2, h / 2) M = cv2.getRotationMatrix2D(center, -median_angle, 1.0) rotated = cv2.warpAffine(rotated, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) # 修剪图像 gray = cv2.cvtColor(rotated,cv2.COLOR_BGR2GRAY) _,thresh = cv2.threshold(gray,1,255,cv2.THRESH_BINARY) contours,hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] x,y,w,h = cv2.boundingRect(cnt) result = rotated[y:y+h,x:x+w] # 显示结果 cv2.imshow("Result", result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码首先读取输入图像,然后将其灰度化并进行边缘检测。接下来使用霍夫变换检测直线,并计算每条直线的角度。通过计算所有直线角度的中位数,确定图像需要旋转的角度,然后使用OpenCV中提供的旋转函数将图像旋转到正确的角度。最后,使用轮廓检测函数找到旋转后的图像的边界框,并将其修剪以去除空白区域。最终,程序将旋转并修剪后的图像显示在屏幕上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值