【华为OD题库-018】AI面板识别-Java
题目
Al识别到面板上有N(1<N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次识别到的指示灯位置可能有差异,以4个坐标值描述Al识别的指示灯的大小和位置(左上角x1,y1,右下角x2.y2)。请输出先行后列排序的指示灯的编号,排序规则:
每次在尚未排序的灯中挑选最高的灯作为基准灯
找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行(即两个灯坐标的差<=灯高度的一半)。
输入描述
第一行为N,表示灯的个数
接下来N行,每行为1个灯的坐标信息,格式为:编号 x1 y1 x2 y2
1∶编号全局唯一
2:1<编号≤100
3: 0<=x1 < x2 ≤ 1000
4: 0<=y1 < y2 ≤ 1000
输出描述
排序后的编号列表,编号之间以空格分隔
示例1:
输入
5
1 0 0 2 2
2 6 1 8 3
3 3 2 5 4
5 5 4 7 6
4 0 4 2 6
输出
1 2 3 4 5
思路
本题描述比较复杂,不好理解,下面转化为好理解的版本。
先找到基准灯:所有灯中最高的,等高时,取最左边的
找到所有与基准灯为同一行的灯,按照从左到右的顺序排序
继续再剩余未排序的灯中找基准灯,重复上述过程。
在实现思路上,我们已经有灯的左上角及右下角坐标,那么我们可以算出每个灯的中心坐标以及半径,假设以(X,Y)表示中心坐标,以R表示半径。
- 由于涉及到复杂对象的比较,我们可以新建一个灯对象(Lamp),它有三个属性,X代表中心点横坐标,Y代表中心点的纵坐标,R代表半径。
- 将每行输入转为一个灯,并放入集合list中
- 为了寻找基准灯,也就是最高和最左边的灯,可以对Lamp对象自定义比较方法,取Y最小的(Y相等时取X最小的)
- 对list按照我们自定义规则进行排序(最高最左的在前)
- 对排序后list的第一个灯,作为基准灯,找到和基准灯在同一行的灯。判断同一行的标准,两个灯纵坐标的差值的绝对值<=灯半径。这个比较方法可以直接写在我们新建的Lamp对象中。
- 对与基准灯同一行的灯,加入到一个临时集合tmp,然后再对tmp排序,按从左到右排序即可(X越小排在越前)
- 将本轮排序结果tmp加入最终的ans中
- 继续寻找下一个基准灯(还未被加入到ans中的里面找最高最左的灯),重复4,5,6,7步骤。
题解
package hwod;import java.util.*;public class AIBoardRecognize {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[][] matrix = new int[n][5];for (int i = 0; i < n; i++) {for (int j = 0; j < 5; j++) {matrix[i][j] = sc.nextInt();}}List<Lamp> res = aIBoardRecognize(matrix);for (int i = 0; i < res.size(); i++) {if (i != 0) System.out.print(" ");System.out.print(res.get(i).getId());}}private static List<Lamp> aIBoardRecognize(int[][] matrix) {int m = matrix.length;List<Lamp> lamps = new ArrayList<>(m);for (int i = 0; i < m; i++) {int id = matrix[i][0];int x = (matrix[i][1] + matrix[i][3]) >> 1;int y = (matrix[i][2] + matrix[i][4]) >> 1;int r = (matrix[i][3] - matrix[i][1]) >> 1;lamps.add(new Lamp(id, x, y, r));}Collections.sort(lamps);List<Lamp> ans = new ArrayList<>(m);int i = 0;while (i < m) {Lamp base = lamps.get(i);List<Lamp> tmp = new ArrayList<>();while (i < m && base.isSameHigh(lamps.get(i))) {tmp.add(lamps.get(i));i++;}Collections.sort(tmp, (o1, o2) -> o1.getX() - o2.getX());ans.addAll(tmp);}return ans;}
}class Lamp implements Comparable<Lamp> {private int id;private int x;private int y;private int r;public Lamp(int id, int x, int y, int r) {this.id = id;this.x = x;this.y = y;this.r = r;}public int getId() {return id;}public int getX() {return x;}public int getY() {return y;}public int getR() {return r;}public boolean isSameHigh(Lamp lamp) {return Math.abs(lamp.getY() - this.getY()) <= this.r;}@Overridepublic int compareTo(Lamp other) {return this.getY() == other.getY() ? this.getX() - other.getX() : this.getY() - other.getY();}
}
为了方便验证,这里再提供三组测试用例
用例1:
5
1 0 0 2 2
2 6 0 8 2
3 3 1 5 3
5 5 1 7 3
4 0 4 7 6
输出: 1 3 5 2 4
用例2:
5
1 0 0 2 2
2 6 0 8 2
3 3 1 5 3
5 5 2 7 4
4 0 4 7 6
输出: 1 3 2 5 4
用例3:
5
1 0 0 2 2
2 6 0 8 2
3 3 1 5 3
5 5 3 7 5
4 0 4 7 6
输出: 1 3 2 4 5
相关文章:
【华为OD题库-018】AI面板识别-Java
题目 Al识别到面板上有N(1<N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次识别到的指示灯位置可能有差异,以4个坐标值描述Al识别的指示灯的大小和位置(左上角x1,y1,右下角x2.y2)。请输出先行…...
[概述] 点云滤波器
拓扑结构 点云是一种三维数据,有几种方法可以描述其空间结构,以利于展开搜索 https://blog.csdn.net/weixin_45824067/article/details/131317939 KD树 头文件:pcl/kdtree/kdtree_flann.h 函数:pcl::KdTreeFLANN 作用:…...
[笔记] 汉字判断
参考博客:如果判断一个字符是西文字符还是中文字符 结论: 汉字转数字后,会占两位字符位,两位都是负数。 参考下面代码 输入:你 输出:01 #include<bits/stdc.h> using namespace std; int main() {cha…...
Android开发笔记(三)—Activity篇
活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 (1)从当前页面跳到新页…...
nodejs+vue+python+php在线购票系统的设计与实现-毕业设计
伴随着信息时代的到来,以及不断发展起来的微电子技术,这些都为在线购票带来了很好的发展条件。同时,在线购票的范围不断增大,这就需要有一种既能使用又能使用的、便于使用的、便于使用的系统来对其进行管理。在目前这种大环境下&a…...
基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)
效果: 功能点: 1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 目的: 给大家提供一些实现思路,找了一圈,一些文章基本不能直接用,错漏百出,代码还藏着掖…...
城市内涝解决方案:实时监测,提前预警,让城市更安全
城市内涝积水问题是指城市地区在短时间内遭遇强降雨后,地面积水过多,导致城市交通堵塞、居民生活不便、财产损失等问题。近年来,随着全球气候变化和城市化进程的加速,城市内涝积水问题越来越突出,成为城市发展中的一大…...
编译正点原子LINUXB报错make: arm-linux-gnueabihf-gcc:命令未找到
编译正点原子LINUX报错make: arm-linux-gnueabihf-gcc:命令未找到 1.报错内容2.解决办法3./bin/sh: 1: lzop: not found4.编译成功 1.报错内容 make: arm-linux-gnueabihf-gcc:命令未找到CHK include/config/kernel.releaseCHK include/generat…...
工地现场智慧管理信息化解决方案 智慧工地源码
智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术,以PC端,移动端,设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…...
Javaweb之HTML,CSS的详细解析
2. HTML & CSS 1). 什么是HTML ? HTML: HyperText Markup Language,超文本标记语言。 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。 标记语言:由标签构成的语言…...
基于python+django+vue开发的酒店预订管理系统 - 毕业设计 - 课程设计
文章目录 源码下载地址项目介绍项目功能界面预览项目备注毕设定制,咨询 源码下载地址 点击这里下载源码 项目介绍 该系统是基于pythondjango开发的酒店预定管理系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可在github…...
使用vscode实现远程开发,并通过内网穿透在公网环境下远程连接
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
ArrayList集合2
ArrayList集合的一些方法 ⑥chear()从列表中移除所有元素 ⑦.isEmpty()判断列表中是否包含元素,不包含返回true,否则返回false public class Test{public static void main(String[] args){Arraylist<String> list new Arraylist<String>()…...
vue+asp.net Web api前后端分离项目发布部署
一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本:vue/cli 5.0.8 编译器版本:vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本:.NET 6.0 编译器版本:vs 2022 二、发布部署步骤 第…...
iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法
iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法 一、问题如下图所示: 二、解决办法:使用Google浏览器(翻译成中文)直接打开该网址 https://www.freeprivacypolicy.com/free-privacy-policy-generator.php 按…...
如何使用Ruby 多线程爬取数据
现在比较主流的爬虫应该是用python,之前也写了很多关于python的文章。今天在这里我们主要说说ruby。我觉得ruby也是ok的,我试试看写了一个爬虫的小程序,并作出相应的解析。 Ruby中实现网页抓取,一般用的是mechanize,使…...
一文深入了解 CPU 的型号、代际架构与微架构
在 10 月 16 号的时候,Intel 正式发布了第 14 代的酷睿处理器。但还有很多同学看不懂这种发布会上发布的各种 CPU 参数。借着这个时机,给大家深入地讲讲 CPU 的型号规则、代际架构与微架构方面的知识。 CPU 在整个计算机硬件中、技术体系中都算是最最重…...
Java通过cellstyle属性设置Excel单元格常用样式全面总结
最近做了一个导出Excel的功能,导出是个常规导出,但是拿来模板一看,有一些单元格的样式设置,包括合并,背景色,字体等等,毕竟不是常用的东西,需要查阅资料完成,但是搜遍全网…...
如何查看WiFi密码
本文分享一下手机和电脑上如何查看已经连接过的WiFi的密码,然后好分享给他人。 手机上分享wifi密码很简单,步骤如下: 生成二维码,读取WiFi密码 1、首先,在“设置”中找到“无线网络”,点击需要查找密码的Wi…...
2023NOIP A层联测22 总结
T1 简单分析了性质,发现可以用双指针求值,后面又发现可以用类似于线段树求最大子段和的方式维护。用时 40min T2 是期望,想了 30min 没有思路,于是打暴力,但是打的时候没有想清楚,就打了很久,大…...
启动我进入数据科学的那一个思维方式转变
原文:towardsdatascience.com/the-one-mindset-change-that-launched-me-into-data-science-3f72bd1df46f?sourcecollection_archive---------2-----------------------#2024-10-19 让它成为现实:微小的改变帮助你进入数据科学或任何梦想职业 https://…...
Redis Sorted Set(有序集合)详解
Redis 里面有一种非常强大的数据结构: Sorted Set(有序集合)简称: ZSet这是 Redis 面试和项目里非常高频的东西。一、什么是 Sorted Set 先记住一句话: Sorted Set 自动排序的 Set它具备: Set 的去重自动排…...
[笔记] 系统分析师 目录
文章目录系统分析师 第一章 绪论系统分析师 第二章 经济管理与应用数学系统分析师 第三章 操作系统基本原理系统分析师 第四章 数据通信与计算机网络系统分析师 第五章 数据库系统系统分析师 第六章 系统配置与性能评价系统分析师 第七章 企业信息化系统分析师 第八章 软件工程…...
VPU与NPU协同优化:边缘AI视觉处理的算力融合实践
1. 项目概述:边缘计算时代的算力融合新范式最近和几个做嵌入式AI和边缘设备的老朋友聊天,大家不约而同地都在讨论一个话题:在资源受限的边缘端,如何把有限的算力“榨干”,让模型跑得更快、更省电。聊着聊着,…...
10个必须知道的simplex-noise.js实战技巧:从基础到高级应用
10个必须知道的simplex-noise.js实战技巧:从基础到高级应用 【免费下载链接】simplex-noise.js A fast simplex noise implementation in Javascript / Typescript. 项目地址: https://gitcode.com/gh_mirrors/si/simplex-noise.js simplex-noise.js是一个快…...
探索工程图纸的数字化世界:DXF图纸的C++解析及OpenCV绘制
探索工程图纸的数字化世界:DXF图纸的C解析及OpenCV绘制 【下载地址】DXF图纸的C解析及OpenCV绘制 本仓库提供了一套解决方案,用于解析DXF(AutoCAD Drawing Interchange Format)图纸文件,并利用C编程语言结合OpenCV库将…...
YOLOv8从零部署到实战:一站式环境配置与核心功能解析
1. YOLOv8环境搭建全攻略 第一次接触YOLOv8时,我也被各种依赖项搞得头晕眼花。经过多次实践,我总结出一套最稳妥的安装方案,特别适合刚入门的新手。YOLOv8作为当前最先进的目标检测框架之一,其安装过程确实比传统CV库复杂些&#…...
告别M3U8下载烦恼:N_m3u8DL-CLI-SimpleG让你的视频下载变得超简单!
告别M3U8下载烦恼:N_m3u8DL-CLI-SimpleG让你的视频下载变得超简单! 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾经面对心爱的在线视频却束手无…...
内网手机远程桌面:解锁高效协同的数字密钥
在数字化办公与生活深度融合的当下,人们对于信息获取与设备操控的便捷性需求持续攀升。当我们身处内网环境,却渴望随时随地操控远端的电脑设备,内网手机远程桌面技术便如同一把精准的数字密钥,打破空间与网络的束缚,为…...
量子退火与模拟退火:工业优化算法对比与应用
1. 量子优化算法概述在工业优化领域,寻找复杂问题的最优解一直是个巨大挑战。量子计算的出现为解决这类问题提供了全新思路。量子退火(Quantum Annealing)和模拟退火(Simulated Annealing)作为两种核心优化方法&#x…...
