教育行业网站建设审批,做网站计划,手机网站产品展示模板,中国室内设计任务网目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、控制台输出 华为OD机试 2023B卷题库疯狂收录中#xff0c;刷题点这里 专栏导读
本专栏收录于《华为OD机试#xff08;JAVA#xff09;真题#xff08… 目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、控制台输出 华为OD机试 2023B卷题库疯狂收录中刷题点这里 专栏导读
本专栏收录于《华为OD机试JAVA真题A卷B卷》。
刷的越多抽中的概率越大每一题都有详细的答题思路、详细的代码注释、样例测试发现新题目随时更新全天CSDN在线答疑。
一、题目描述
AI识别到面板上有N1 ≤ N ≤ 100个指示灯灯大小一样任意两个之间无重叠。
由于AI识别误差每次别到的指示灯位置可能有差异以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1右下角x2,y2)
请输出先行后列排序的指示灯的编号排序规则
每次在尚未排序的灯中挑选最高的灯作为的基准灯找出和基准灯属于同一行所有的灯进行排序。两个灯高低偏差不超过灯半径算同一行即两个灯坐标的差 ≤ 灯高度的一半。
二、输入描述
第一行为N表示灯的个数 接下来N行每行为1个灯的坐标信息格式为编号 x1 y1 2 y2
编号全局唯一1 ≤ 编号 ≤ 1000 ≤ x1 x2 ≤ 10000 ≤ y1 y2 ≤ 1000
三、输出描述
排序后的编号列表编号之间以空格分隔。
四、解题思路
第一行输入灯的个数N接下来的N行输入灯的序号和坐标左上角x1,y1右下角x2,y2比如1 1 1 3 3定义一个等的集合将灯的序号和坐标以Light对象的形式加入其中循环灯集合lightList 先行后列找出未排序最大的灯找出同一行的灯按照先行后列进行排序 输出先行后列排序的指示灯的编号。
五、Java算法源码
package com.guor.od;import java.util.*;public class OdTest {static ListLight lightList new ArrayList();/*** 请输出先行后列排序的指示灯的编号** 找出和基准灯属于同一行所有的灯进行排序。* 两个灯高低偏差不超过灯半径算同一行*/public static void main(String[] args) {Scanner sc new Scanner(System.in);// 灯的个数int N Integer.parseInt(sc.nextLine());for (int i 0; i N; i) {int[] nums Arrays.stream(sc.nextLine().split( )).mapToInt(Integer::parseInt).toArray();int id nums[0];int x1 nums[1];int y1 nums[2];int x2 nums[3];int y2 nums[4];Light light new Light(id, x1, y1, x2, y2);lightList.add(light);}while (lightList.size() 0) {Light maxLight getMaxLight();System.out.print(maxLight.id );ListLight sameLineLights getSameLineLights(maxLight);sameLineLights.sort(new ComparatorLight() {Overridepublic int compare(Light l1, Light l2) {if (l1.x1 l2.x1)return -1;if (l1.x1 l2.x1)return 1;return 0;}});for (Light l : sameLineLights) {System.out.print(l.id );}}}// 找出未排序的最大的那个public static Light getMaxLight() {Light light null;for (Light lt : lightList) {if (light null) {light lt;}if (lt.y1 light.y1) {light lt;}if (lt.y1 light.y1) {if (lt.x1 light.x1) {light lt;}}}lightList.remove(light);return light;}public static ListLight getSameLineLights(Light light) {ListLight lights new ArrayList();for (Light lt : lightList) {if (lt.y1 light.y1 || (light.y1 - lt.y1) (light.y1 - light.y2) / 2) {lights.add(lt);}}lightList.removeAll(lights);return lights;}static class Light {int id, x1, y1, x2, y2;public Light(int id, int x1, int y1, int x2, int y2) {super();this.id id;this.x1 x1;this.y1 y1;this.x2 x2;this.y2 y2;}}
}六、效果展示
1、输入
5 1 1 6 3 4 2 4 5 6 3 3 7 4 9 2 4 10 4 12 2 5 5 2 7 0
2、输出
1 2 3 4 5
3、说明
请输出先行后列排序的指示灯的编号。
找出和基准灯属于同一行所有的灯进行排序。
两个灯高低偏差不超过灯半径算同一行。 4、控制台输出 下一篇华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】感谢fly晨发现这个问题并提供更优质的算法
本文收录于华为OD机试JAVA真题A卷B卷
刷的越多抽中的概率越大每一题都有详细的答题思路、详细的代码注释、样例测试发现新题目随时更新全天CSDN在线答疑。