目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、补充说明
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、再输入
- 4、再输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
DVD机在视频输出时,为了保护电视显像管,在待机状态会显示屏保动画,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹。
请根据如下要求,实现屏保Logo坐标的计算。
- 屏幕是一个800 * 600 像素的矩形,规定屏幕的左上角为坐标原点,沿横边向右方向为X轴,沿竖边向下为Y轴;
- Logo是一个 50 * 25 像素的矩形,初始状态下,左上角点坐标记作(x,y),它在X和Y方向均以1像素/秒的速度运动;
- 遇到屏幕四个边缘后,会发生镜面反弹,即以45°碰撞边缘,再改变方向以45°弹出;
- 当Logo和四个角碰撞时,两个边缘同时反弹的效果时,Logo会原路返回;
请编码实现,t秒后Logo左上角的坐标。
二、输入描述
输入3个数字,以空格分割;
x y t
x表示Logo左上角的初始X坐标;
y表示Logo左上角的初始Y坐标;
t表示时间,题目要求t秒后Logo左上角的位置;
三、输出描述
输出2个数字,以空格分割;
x y
第一个数字表示t秒后,Logo左上角的X坐标;
第二个数字表示t秒后,Logo左上角的Y坐标;
四、补充说明
所有用例均保证:
- 输入的x和y坐标会保证整个Logo都在屏幕范围内,Logo不会出画;
- 所有输入数据都是合法的数值,且不会出现负数;
- t的最大值是100000;
四、解题思路
- 以最简单的0,0位置起始移动;
- 如上图所示,屏幕宽600,长800,屏保成45°角均匀移动,会在(600 - 25 = 575)处,碰到屏幕下沿;
- 然后以45°角反弹;
- 再过5秒,会变为(580,570),因为横坐标在继续增加,纵坐标在减少;
五、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
3、再输入
0 0 580
4、再输出
580 570
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。