【华为OD题库-033】经典屏保-java

2023-11-23 00:52

本文主要是介绍【华为OD题库-033】经典屏保-java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

DVD机在视频输出时,为了保护电视显像管,在待机状态会显示"屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹:请根据如下要求,实现屏保Logo坐标的计算算法
1、屏幕是一个800 * 600像素的矩形,规定屏幕的左上角点坐标原点,沿横边向右方向为X轴,沿竖边向下方向为Y轴
2、Logo是一个50 * 25像素的矩形,初始状态下,左上角点坐标记做(x,y),它在X和Y方向上均以1像素/秒的速度开始运动;
3、遇到屏幕四个边缘后,会发生镜面反弹,即以45°碰撞边缘,再改变方向以45°弹出;当Logo和四个角碰撞时,两个边缘同时反弹的效果是Logo会原路返回。
在这里插入图片描述
请编码实现,t秒后Logo左上角点的坐标
输入描述:
输入3个数字,以空格分隔:x y t
第一个数字表示Logo左上角点的初始X坐标
第二个数字表示Logo左上角点的初始Y坐标:
第三个数字表示时间t,题目要求即求t秒后Logo左上角点的位置
输出描述
输出2个数字,以空格分隔:x y
第一个数字表示t秒后,Logo左上角点的X坐标
第二个数字表示t秒后,Logo左上角点的Y坐标
补充说明:
所有用例均保证:
1、输入的x和y坐标会保证整个Logo都在屏幕范围内,Logo不会出画;
2、所有输入数据都是合法的数值,且不会出现负数:
3、t的最大值为100000。
示例1
输入:
0 0 10
输出:
10 10
说明:
输入样例表示Logo初始位置在屏幕的左上角点,10s后,Logo在X和Y方向都移动了10像素,因此输出10 10.
示例2
输入:
500 570 10
输出:
510 570
说明:
输入样例表示初始状态下,Logo的下边缘再有5像素就碰到屏幕下边缘了,5s后,会与屏幕碰撞,碰撞后,斜向45弹出,又经过5s后,Logo与起始位置相比,水平移动了10像素,垂直方向回到了原来的高度。

思路

送分题,两种方法:

  1. 程序模拟过程,得到t秒后的坐标
  2. 直接数学计算得出坐标

思路一:程序模拟过程

设一个数组dp=new int[]{1,1},dp[0]=1代表x向右移动1个单位长度,dp[1]代表y向下移动1个单位长度
根据题目要求:
当x到达边界时(x+50=800),此时应该改变移动方向,即dp[0] = -1
同理可得,当y+25=60时,y也应该改变方向,即dp[1] = -1。
什么时候把方向再改回来呢?当x或者y为0时,应该将dp[0]、dp[1]修改为1
写一个循环,直接可以得到t秒后x,y的新坐标。每秒x和y的变化过程为:x=x+dp[0];y=y+d[1]

思路二:数学计算

先不考虑越界情况,(x,y)经过t秒后得到的新坐标应该时(x+t,y+t)
考虑越界情况,x的最大值为750,y的最大值为575。x和y变化规律相同,以x为例说明:
当第一次越界时,比如x计算出来等于800,800%750=50,第一次越界应该向左反弹,所以实际的x为:750-50=700
当第二次越界时,比如x计算出来等于1560,1560%750=10,实际的运动轨迹应该是0-750-0-10,此时x的值就等于10
综上:我们可以直接使用x+t得到x的新坐标,然后计算m,n的值:m=(x+t)/750;n=(x+t)%750
如果m%2=1,即奇数次越界,此时向左反弹,结果应该为750-n;
如果m%2=0,即偶数次越界,此时向右反弹,结果应该为n;

题解

package hwod;import java.util.Arrays;
import java.util.Scanner;public class ScreenProtect {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();int x = nums[0], y = nums[1], t = nums[2];int[] res = screenProtect(x, y, t);for (int i = 0; i < res.length; i++) {if (i != 0) System.out.print(" ");System.out.print(res[i]);}}private static int[] screenProtect(int x, int y, int t) {int width = 800, height = 600;int[] dp = new int[]{1, 1};while (t-- > 0) {if (x == 0) {dp[0] = 1;}if (x +50 == width) {dp[0] = -1;}if (y == 0) {dp[1] = 1;}if (y +25 == height) {dp[1] = -1;}x += dp[0];y += dp[1];}return new int[]{x, y};}private static int[] screenProtect2(int x, int y, int t) {int max_x = 800-50, max_y = 600-25;x = x + t;y = y + t;int modx = x % max_x, mody = y % max_y;x = x / max_x % 2 == 1 ? max_x - modx : modx;y = y / max_y % 2 == 1 ? max_y - mody : mody;return new int[]{x, y};}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

这篇关于【华为OD题库-033】经典屏保-java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

SpringBoot 中 CommandLineRunner的作用示例详解

《SpringBoot中CommandLineRunner的作用示例详解》SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的... 目录1、CommandLineRunnerSpringBoot中CommandLineRunner的作用

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

Java日期类详解(最新推荐)

《Java日期类详解(最新推荐)》早期版本主要使用java.util.Date、java.util.Calendar等类,Java8及以后引入了新的日期和时间API(JSR310),包含在ja... 目录旧的日期时间API新的日期时间 API(Java 8+)获取时间戳时间计算与其他日期时间类型的转换Dur

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati