【华为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表示半径。

  1. 由于涉及到复杂对象的比较,我们可以新建一个灯对象(Lamp),它有三个属性,X代表中心点横坐标,Y代表中心点的纵坐标,R代表半径。
  2. 将每行输入转为一个灯,并放入集合list中
  3. 为了寻找基准灯,也就是最高和最左边的灯,可以对Lamp对象自定义比较方法,取Y最小的(Y相等时取X最小的)
  4. 对list按照我们自定义规则进行排序(最高最左的在前)
  5. 对排序后list的第一个灯,作为基准灯,找到和基准灯在同一行的灯。判断同一行的标准,两个灯纵坐标的差值的绝对值<=灯半径。这个比较方法可以直接写在我们新建的Lamp对象中。
  6. 对与基准灯同一行的灯,加入到一个临时集合tmp,然后再对tmp排序,按从左到右排序即可(X越小排在越前)
  7. 将本轮排序结果tmp加入最终的ans中
  8. 继续寻找下一个基准灯(还未被加入到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

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

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

相关文章

三、IPSec VPN原理

IPSec 1、IPSec起源和定义2、IPSec原理2.1、IPSec协议框架2.1.1、安全联盟2.1.2、安全协议2.1.3、安全协议报文头结构2.1.4、封装模式2.1.5、加密和验证2.1.6、IKE安全机制 2.2、IPSec基本原理2.2.1、定义IPSec保护的数据流2.2.2、IKEv2协商安全联盟的过程 2.3、IPSec增强原理2…

uniapp之actionsheet 自定义组件

uniapp本身自带的actionsheet太丑&#xff0c;不够美观。闲着也是闲着&#xff0c;自己实现了一个类似的选择器。 支持功能&#xff1a; 1、左对齐 2、右对齐 3、居中 4、可加图标 下面贴出使用教程&#xff1a; <template><view><action-sheet alignment&…

go测试库之apitest

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

JavaSE基础 --- 类与对象

1.类与对象的定义 类是一种抽象的数据类型&#xff0c;它描述了一类对象的行为和状态。例如&#xff0c;我们可以定义一个名为“Dog”的类&#xff0c;它描述了狗这类动物的一般特性&#xff0c;如颜色、品种等状态&#xff0c;以及跑、叫等行为。 对象则是类的实例&#xff0c…

Java——接口类和抽象类的方法声明不需要加{}

在Java中&#xff0c;接口类和抽象类的方法声明是不需要加{}的。具体来说&#xff1a; 1. 接口类&#xff08;Interface&#xff09;&#xff1a;接口类定义了一组方法的规范&#xff0c;没有具体的方法实现。在接口中&#xff0c;方法声明只包含方法名、参数列表和返回类型&a…

两分钟搞定MySQL安装——极速mysql5.7安装教程

一、下载mysql mysql官网传送带&#xff1a; MySQL :: Download MySQL Community Server 选择好版本后直接下载即可&#xff0c;版本格式为zip格式。 二、安装mysql 1、解压zip安装包 ps&#xff1a;解压缩的路径里面不要出现中文哦&#xff01; 2、设置配置文件 新建data…

dubbo没有找到生产者

1、没有找到生产者 com.alibaba.dubbo.rpc.RpcException: No provider available from registry 127.0.0.1:2181 for service .... , please check status of providers(disabled, not registered or in blacklist)2、 查看是不是 对应的providers 没有 注册上去 找到 zk 对应…

解决爬虫在重定向(Redirect)情况下,URL没有变化的方法

重定向是一种网络服务&#xff0c;它可以实现从一个网页跳转到另一个网页的功能。它把用户请求的网页重定向到一个新的位置&#xff0c;而这个位置可以是更新的网页&#xff0c;或最初请求的网页的不同版本。另外&#xff0c;它还可以用来改变用户流量&#xff0c;当用户请求某…

内网穿透Windows下快速搭建个人WEB项目无需服务器

&#x1f4d1;前言 本文主要是windows下内网穿透文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

HTML、CSS和JavaScript,实现换肤效果的原理

这篇涉及到HTML DOM的节点类型、节点层级关系、DOM对象的继承关系、操作DOM节点和HTML元素 还用到HTML5的本地存储技术。 换肤效果的原理&#xff1a;是在选择某种皮肤样式之后&#xff0c;通过JavaScript脚本来加载选中的样式&#xff0c;再通过localStorage存储。 先来回忆…

MYSQL 8.0 配置CDC(binlog)

CDC&#xff08;Change Data Capture&#xff09;即数据变更抓取&#xff0c;通过源端数据源开启CDC&#xff0c;ROMA Connect 可实现数据源的实时数据同步以及物理表的物理删除同步。这里介绍通过开启Binlog模式CDC功能。 注意&#xff1a;1、使用MYSQL8.0及以上版本。 2、不…

剑指JUC原理-9.Java无锁模型

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

docker 存储目录迁移

参考&#xff1a;【Docker专题】WSL镜像包盘符迁移详细笔记 - 掘金 docker迁移 一 默认目录 Windows版本&#xff08;Windows 10 wsl 2&#xff09;docker 默认程序安装到c盘&#xff0c;数据存放于 C:\Users\当前用户名\AppData\Local\Docker\wsl\data\ext4.vhdx 这样会导致…

延时摄影视频制作工具 LRTimelapse mac中文版特点介绍

lrTimelapse mac是一款适用于 Windows 和 macOS 系统的延时摄影视频制作软件&#xff0c;可以帮助用户创建高质量的延时摄影视频。该软件提供了直观的界面和丰富的功能&#xff0c;支持多种时间轴摄影工具和文件格式&#xff0c;并具有高度的可定制性和扩展性。 lrTimelapse ma…

牛客项目(五)-使用kafka实现发送系统通知

kafka入门以及与spring整合 Message.java import java.util.Date;public class Message {private int id;private int fromId;private int toId;private String conversationId;private String content;private int status;private Date createTime;public int getId() {retur…

Python数据分析实战-筛选出DataFrame中指定列都不包含缺失值的记录(附源码和实现效果)

实现功能 筛选出DataFrame中指定列都不包含缺失值的记录 实现代码 import pandas as pd# 创建示例DataFrame data {A: [1, 2, 3, None, 5],B: [1, None, 3, 4, 5],C: [1, 2, 3, 4, 5] } df pd.DataFrame(data)# 筛选出指定列都不包含缺失值的记录 columns_to_check [A, B…

Prometheus+Node_exporter+Grafana实现监控主机

PrometheusNode_exporterGrafana实现监控主机 如果没有安装相关的配置&#xff0c;首先要进行安装配置&#xff0c;环境是基于Linux&#xff0c;虚拟机的相关环境配置在文末给出&#xff0c;现在先讲解PrometheusNode_exporterGrafana的安装和使用。 一.Prometheus安装 虽然…

家用洗地机什么牌子最好?家用洗地机排行榜

对于现在的年轻人来说&#xff0c;打扫家里的卫生一直是非常头疼的问题&#xff0c;上班一天已经很累了&#xff0c;回家还需要花费很长时间吸地、拖地真的很闹心。特别是对于有小孩子的家庭&#xff0c;地面弄上一些油污、饭菜简直就是家常便饭&#xff0c;每次打扫起来非常费…

NFC芯片MS520:非接触式读卡器 IC

MS520 是一款应用于 13.56MHz 非接触式通信中的高集成 度读写卡芯片。它集成了 13.56MHz 下所有类型的被动非接触 式通信方式和协议&#xff0c;支持 ISO14443A 的多层应用。 主要特点 ◼ 高度集成的解调和解码模拟电路 ◼ 采用少量外部器件&#xff0c;即可将输…

X号是否可以接入OKCC

答案当然是可以。 但是有个前提&#xff0c;需要借助X号平台&#xff0c;也就是我们常说的小号平台。 X号只是号码资源&#xff0c;没有载体&#xff0c;要将X号接入OKCC&#xff0c;需要通过小号平台&#xff0c;类似号码池一样的平台&#xff0c;以API的方式接入OKCC。 所以很…