华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、补充说明
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、再输入
      • 4、再输出

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

一、题目描述

DVD机在视频输出时,为了保护电视显像管,在待机状态会显示屏保动画,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹。

请根据如下要求,实现屏保Logo坐标的计算。

  1. 屏幕是一个800 * 600 像素的矩形,规定屏幕的左上角为坐标原点,沿横边向右方向为X轴,沿竖边向下为Y轴;
  2. Logo是一个 50 * 25 像素的矩形,初始状态下,左上角点坐标记作(x,y),它在X和Y方向均以1像素/秒的速度运动;
  3. 遇到屏幕四个边缘后,会发生镜面反弹,即以45°碰撞边缘,再改变方向以45°弹出;
  4. 当Logo和四个角碰撞时,两个边缘同时反弹的效果时,Logo会原路返回;

请编码实现,t秒后Logo左上角的坐标。

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路_第1张图片

二、输入描述

输入3个数字,以空格分割;

x y t

x表示Logo左上角的初始X坐标;
y表示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位置起始移动;
  2. 如上图所示,屏幕宽600,长800,屏保成45°角均匀移动,会在(600 - 25 = 575)处,碰到屏幕下沿;
  3. 然后以45°角反弹;
  4. 再过5秒,会变为(580,570),因为横坐标在继续增加,纵坐标在减少;

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路_第2张图片

五、Java算法源码

package com.guor.od;

import java.util.Scanner;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // Logo左上角的初始X坐标
        int x = sc.nextInt();
        // Logo左上角的初始Y坐标
        int y = sc.nextInt();
        // 时间
        int t = sc.nextInt();

        int x_step = 1;
        int y_step = 1;
        // 屏幕长
        int width = 800;
        // 屏幕宽
        int height = 600;

        // 求t秒后Logo左上角的位置
        for (int i = 0; i < t; i++) {
            if (x == 0) {
                x_step = 1;
            }
            if (y == 0) {
                y_step = 1;
            }
            if (x + 50 == width) {
                x_step = -1;
            }
            if (y + 25 == height) {
                y_step = -1;
            }

            x += x_step;
            y += y_step;
        }
        // 输出t秒后,Logo左上角的X坐标和Y坐标
        System.out.println(x + " " + y);
    }
}

六、效果展示

1、输入

0 0 575

2、输出

575 575

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路_第3张图片

3、再输入

0 0 580

4、再输出

580 570

华为OD机试真题 Java 实现【经典屏保】【2023 B卷 100分】,附详细解题思路_第4张图片


下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,程序人生,学习,云原生)