【华为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),查看当前专栏更新的所有题目。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试:功能测试常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的&#xff0c;这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求&#xff0c;密码不符合要求(格式上的要求) ④ 密码符合要求&#xf…

JavaScript实现右键菜单

1、代码实现 window.onload function () {(function () {// 自定义右键菜单内容并插入到body最后一个节点前let dom <div id"rightMenuBars"><div class"rightMenu-group rightMenu-small"><div class"rightMenu-item"><…

【应用程序启动过程-三种加载控制器的方式-上午内容复习 Objective-C语言】

一、我们先来回忆一下,上午所有内容 1.首先呢,我们先说的是这个“应用程序启动过程”, 应用程序启动过程里面,有三方面内容 1)UIApplication对象介绍 2)AppDelegate对象介绍 3)应用程序启动过程 现在不知道大家对这个应用程序启动过程有印象吗, 2.首先,这个UIAp…

渗透测试高级技巧(一):分析验签与前端加密

“开局一个登录框” 在黑盒的安全测试的工作开始的时候&#xff0c;打开网站一般来说可能仅仅是一个登录框&#xff1b;很多时候这种系统往往都是自研或者一些业务公司专门研发。最基础的情况下&#xff0c;我们会尝试使用 SQL 注入绕过或者爆破之类的常规手段&#xff0c;如果…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、关于Lena图片 7、…

简于外 强于内,联想全新ThinkCentre M90a Pro Gen4以强劲性能开启商用新体验

近日&#xff0c;联想发布了最新一代商用台式一体机联想ThinkCentre M90a Pro Gen4。作为联想ThinkCentre M大师系列的旗舰产品&#xff0c;其配备了优质的显示屏&#xff0c;拥有强大的性能和稳定安全的特性&#xff0c;能够满足多样的工作场合&#xff0c;为商用一体机的行业…

面试题:你怎么理解System.out.println() ?

文章目录 首先分析System源码out源码分析println分析拓展知识点 你如何理解System.out.println() ? 学了这么久的面向对象编程&#xff0c;那如何用一行代码体现呢&#xff1f; 如果你能自己读懂System.out.println()&#xff0c;就真正了解了Java面向对象编程的含义 面向对…

Ajax入门-Express框架介绍和基本使用

电脑实在忒垃圾了&#xff0c;出现问题耗费了至少一刻钟time&#xff0c;然后才搞出来正常的效果&#xff1b; 效果镇楼 另外重新安装了VScode软件&#xff0c;原来的老是报错&#xff0c;bug。。&#xff1b; 2个必要的安装命令&#xff1b; 然后建立必要的文件夹和文件&…

MAX/MSP SDK学习07:list传递

实现自定义Obejct&#xff0c;要求将传入的一组数据100后传出。 #include "ext.h" #include "ext_obex.h" typedef struct _listTrans {t_object ob;void* outLet;t_atom* fArr;long listNum;} t_listTrans;void* listTrans_new(t_symbol* s, long arg…

【资深硬件工程师总结-千兆以太网设计指南】

文章目录 01通用PCB布线指南02标志焊盘中的接地过孔区示例03EMI注意事项04ESD注意事项 资深硬件工程师总结-千兆以太网设计指南 本应用笔记旨在帮助客户使用Microchip的10/100/1000 Mbps以太网器件系列设计PCB。本文档提供有关PCB布线的建 议&#xff0c; PCB 布线是保持信号完…

想分析全国用电及煤气、液化石油气供应利用情况,这部分数据对你有帮助!

随着经济的发展和人民生活水平的提高&#xff0c;能源的需求量越来越大。其中&#xff0c;电力和煤气、液化石油气等能源的供应利用情况与我们的日常生活息息相关。 今天我们根据《中国城市统计年鉴》统计的中国地级及以上城市的煤气及液化石油气供应及利用情况的指标&#xff…

【并发编程】ThreadLocal详解与原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Redis整数集合

前言 整数集合(intset)是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层实现。 一. 整数集合的实现 1.1 结构 整数集合(intset)是Redis用于保存整数值的集合抽象数据…

【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

文章目录 进程间通信1.进程间通信的介绍1.1目的和发展 2.进程间通信分类3.管道3.1匿名管道3.1.1匿名管道的原理&#xff08;文件角度&#xff09;3.1.2匿名管道的原理&#xff08;内核角度&#xff09;3.1.3管道读写规则3.1.4管道特点 3.2命名管道3.2.1创建命名管道3.2.2命名管…

【计算机网络学习之路】TCP socket编程

文章目录 前言一. 服务器1. 初始化服务器2. 启动服务器 二. 客户端三. 多进程服务器结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇博客基于UDP socket基础&#xff0c;介绍…

【SpringCloud】认识微服务、服务拆分以及远程调用

SpringCloud 1.认识微服务 1.1单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 单体架构的优缺点&#xff1a; 优点&#xff1a; 架构简单&#xff0c;部署成本低 缺点&#xff1a; 耦合度高&#xff08;维护困难&#x…

设备状态监测与故障诊断系统的作用

随着工业生产的发展和技术的进步&#xff0c;设备状态监测与故障诊断系统在工业领域中扮演着越来越重要的角色。这一系统通过实时监测设备的状态和参数&#xff0c;及时发现潜在的故障&#xff0c;并提供预警信号&#xff0c;以降低生产中断、提高安全性和维护效率。以下将详细…

Django 模型和Admin站点管理(三)

一、定义模型 &#xff08;1&#xff09; 创建模型类&#xff0c;必须要继承自 models.Model from django.db import models# Create your models here. #设计数据库 #创建模型 class UserModel(models.Model):namemodels.CharField(max_length30) #对应于SQL name varchar(30…

慕尼黑电子展Samtec Demo | 回环测试带来Samtec产品组合优异表现

【摘要/前言】 大家好&#xff01;Electronica虎家展台Demo系列回来咯。 实践出真知&#xff0c;再好的纸面数据都不如来一场实际的测试和演示。Samtec团队始终在努力为客户带来卓越的产品和优质服务。而这其中&#xff0c;Demo演示的存在至关重要。演示过程可以为大家带来了…

ubuntu编译sqlite3并使用

SQLite3是一种轻量级的关系型数据库管理系统&#xff0c;它是在C语言基础上实现的。SQLite3具有许多优点&#xff0c;例如&#xff1a; 1.灵活&#xff1a;它可以在多种操作系统上运行&#xff0c;并且可以将多个数据库文件合并成一个文件。 2.易于使用&#xff1a;SQLite3使用…