华为OD机试 - 反射计数 - 矩阵(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中,刷题++点这里++

专栏导读

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

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

一、题目描述

给定一个包含 0 和 1 的二维矩阵, 给定一个初始位置和速度。

一个物体从给定的初始位置出发, 在给定的速度下进行移动, 遇到矩阵的边缘则发生镜面反射无论物体经过 0 还是 1,都不影响其速度。

请计算并给出经过t 时间单位后,物体经过 1 点的次数。

矩阵以左上角位置为0,0,例如坐标为2 , 1

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 1 0 0 0 0

注意:

如果初始位置的点是 1, 也计算在内

时间的最小单位为1, 不考虑小于 1 个时间单位内经过的点

二、输入描述

第一行为初始信息

第二行开始一共h行,为二维矩阵信息

其中w,h 为矩阵的宽和高x,y 为起始位置

sx,sy为初始速度t为经过的时间

三、输出描述

经过1的个数。

注意:初始位置也要计算在内

四、解题思路

  1. 读取和解析输入数据,包括矩阵的大小(宽度和高度)、起始位置、初始速度和模拟时间。
  2. 根据给定的速度,物体将在矩阵中移动。当物体碰到矩阵的边缘时,它需要反射。具体来说,如果物体触及左边或右边,水平速度反向(sx变号)。如果触及上边或下边,垂直速度反向(sy变号)。
  3. 统计经过的"1"点数: 在模拟过程中,每次物体到达一个新位置,都需要检查该位置是否为"1"。如果是,则累加计数。
  4. 从初始时间开始,每个时间单位内更新物体位置,并处理可能的边界反射。

五、Java算法源码

java 复制代码
public class Test01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int w = arr[0]; // 宽度
        int h = arr[1]; // 高度
        int x = arr[2]; // 初始x位置
        int y = arr[3]; // 初始y位置
        int sx = arr[4]; // 初始x速度
        int sy = arr[5]; // 初始y速度
        int t = arr[6]; // 时间

        // 读取矩阵数据
        int[][] matrix = new int[h][w];
        for (int i = 0; i < h; i++) {
            String line = sc.nextLine();
            for (int j = 0; j < line.length(); j++) {
                matrix[i][j] = Character.getNumericValue(line.charAt(j));
            }
        }

        // 计数器,初始化为0
        int count = 0;

        // 如果起始位置是1,计数
        if (matrix[y][x] == 1) {
            count++;
        }

        // 模拟运动
        for (int i = 0; i < t; i++) {
            // 更新位置
            x += sx;
            y += sy;

            // 处理水平方向的边界反射
            if (x < 0){
                x = 1;// 立即修正位置
                sx = -sx; // 反转速度
            }else if(x >= w){
                x = w-2;// 立即修正位置
                sx = -sx; // 反转速度
            }

            // 处理垂直方向的边界反射
            if (y < 0){
                y = 1;
                sy = -sy; // 反转速度
            }else if (y >= h) {
                y = h - 2;
                sy = -sy; // 反转速度
            }

            // 计算经过1的次数
            if (matrix[y][x] == 1) {
                count++;
            }
        }

        // 输出结果
        System.out.println(count);
    }
}

六、效果展示

1、输入

12 7 2 1 1 -1 13

001000010000

001000010000

001000010000

000100001000

001000010000

001000010000

001000010000

2、输出

3

3、说明

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

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

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

相关推荐
一念一花一世界2 分钟前
Arbess从基础到实践(25) - 集成GitLab+阿里云OSS实现Java项目自动化构建并将制品上传Aliyun OSS
java·阿里云·gitlab·cicd·arbess
liyi_hz20084 分钟前
企业信创落地深水区:O2OA(翱途)平台的国产化适配实践与技术思考
java·开源软件
她说..7 分钟前
手机验证码功能实现(附带源码)
java·开发语言·spring boot·spring·java-ee·springboot
Adellle10 分钟前
Java-Stream流
java
xUxIAOrUIII18 分钟前
JWT和拦截器使用【附Maven中操作步骤】
java·maven
带刺的坐椅20 分钟前
Liquor(Java 脚本)替代 Groovy 作脚本引擎的可行性分析
java·groovy·liquor
武子康25 分钟前
Java-203 RabbitMQ 生产者/消费者工作流程拆解:Connection/Channel、默认交换器、ACK
java·分布式·消息队列·rabbitmq·erlang·ruby·java-rabbitmq
Coder_Boy_32 分钟前
前端和后端软件系统联调经典问题汇总
java·前端·驱动开发·微服务·状态模式
雨中飘荡的记忆43 分钟前
Retrofit:优雅的JAVA网络请求框架实战
java
Thexhy1 小时前
基础篇:Redis核心命令及用法
java·linux·redis