【华为OD题库-018】AI面板识别-Java

news/2024/7/20 16:44:51 标签: 华为od, 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;
    }

    @Override
    public 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.niftyadmin.cn/n/5148402.html

相关文章

红海云签约中国煤科信息公司,数智引领科技型国企人力资源数字化变革

中煤科工集团信息技术有限公司&#xff08;以下简称“中国煤科信息公司”&#xff09;隶属于中国煤炭科工集团&#xff0c;作为中国煤科核心软件的研发中心、数据技术中心、内部信息化支撑中心&#xff0c;是中国煤科加快智能矿山建设和数字化转型的核心力量。 基于对数字化转…

研究人员发现34个Windows驱动程序易受完全设备接管攻击

最近&#xff0c;研究人员发现了34个易受攻击的Windows驱动程序&#xff0c;这些漏洞可能被非特权威胁行为者利用来完全接管设备&#xff0c;并在底层系统上执行任意代码。这一发现引发了广泛关注&#xff0c;并引起了Windows用户的担忧。 导语 随着科技的不断进步&#xff0c;…

打造个人的Minecraft服务器:Java+cpolar实现我的世界联机游戏

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

『亚马逊云科技产品测评』活动征文|搭建基础运维环境

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 1、什么是容器化部署 2、连接到控制台 3、安装docker 3.1 更新…

web3 React dapp中编写balance组件从redux取出并展示用户资产

好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 ganache -d然后 我们启动自己的项目 顺手发…

Java 实现uniapp本机手机号一键登录

这里简单的贴一下后端的解析代码 其他配置项参照uniapp的官方文档配置就好了 这里的accessToken和openid是前端请求uCloud获取的 Data public class UniAppLoginVO {private Integer code;private String message;private ResultDataVO data;private Boolean success;private R…

MFC发送http https以及json解析

域名解析成IP char szWeb[128] "www.baidu.com";struct hostent *pHost NULL;pHost gethostbyname(szWeb);//完成主机名到域名的解析char *IP inet_ntoa(*((struct in_addr *)pHost->h_addr));CString ipStr IP;请求三部曲&#xff1a; 1、CInternetSession…

年轻人一定要去大城市才有好发展吗?

年轻人&#xff0c;一定要去大城市才有好的发展吗&#xff1f;这个问题就像是在问&#xff1a;一定要吃海鲜才能活得好吗&#xff1f; 当然&#xff0c;大城市就像是一个巨大的海鲜市场&#xff0c;让你眼花缭乱&#xff0c;应接不暇。在那里&#xff0c;你可能会遇到各种各样…