华为OD统一考试 - 反射计数

题目描述

给定一个包含 0 和 1 的二维矩阵。

给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。

无论物体经过 0 还是 1,都不影响其速度。

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

矩阵以左上角位置为 [0, 0](列(x),行(y)),例如下面A点坐标为 [2, 1](第二列,第一行)

注意:

  1. 如果初始位置的点是 1,也计算在内
  2. 时间的最小单位为 1,不考虑小于 1 个时间单位内经过的点

输入描述

第一行为初始信息

<w><h><x><y><sx><sy><t>

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

其中:

  • w,h 为矩阵的宽和高
  • x,y 为起始位置
  • sx,sy 为初始速度
  • t 为经过的时间

所有输入都是有效的,数据范围如下:

  • 0 < w < 100
  • 0 < h < 100
  • 0 ≤ x < w
  • 0 ≤ y < h
  • -1 ≤ sx ≤ 1
  • -1 ≤ sy ≤ 1
  • 0 ≤ t <100

输出描述

经过 1 的个数

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

用例

输入

12 7 2 1 1 -1 13

001000010000

001000010000

001000010000

001000010000

001000010000

001000010000

001000010000

输出

3

说明

初始位置为(2,1),速度为(1,-1),那么13个时间单位后,经过点1的个数为3

题目解析

题目运动示意图如下:

如果当前位置 x,y 按照速度 sx,sy 运动后,新位置越界的话,比如新位置x,y:

  • x < 0注意 -1 ≤ sx, sy ≤ 1,因此 x < 0 越界时必然 x = -1, 则经过反射,x = 1
  • x >= w注意 -1 ≤ sx, sy ≤ 1,因此 x >= w 越界时必然 x = w, 则经过反射,x = w - 2
  • y < 0注意 -1 ≤ sx, sy ≤ 1,因此 y < 0 越界时必然 y = -1,则经过反射,y = 1
  • y >= h​​​​​​​注意 -1 ≤ sx, sy ≤ 1,因此 y >= h 越界时必然 y = h,则经过反射,y = h - 2

还需要注意的是,反射不仅会影响位置,而且会影响和后续的速度方向:

  • 一旦新位置x越界,则后续速度 sx = -sx
  • 一旦新位置y越界,则后续速度 sy = -sy

我们只要记录运动路径中遇到的元素1的个数即可。


import Foundation

func ODTest_2_24() {
    print("输入描述")
    print("第一行为初始信息 <w><h><x><y><sx><sy><t>")
    // 注意本题横纵坐标是反的,因此y其实是行号,x是列号
    let array = (readLine() ?? "").split(separator: " ").map { Int($0) ?? 0 }
    let w = array[0]
    let h = array[1]
    var x = array[2]
    var y = array[3]
    var sx = array[4]
    var sy = array[5]
    var t = array[6]
    print("第二行开始一共 h 行,为二维矩阵信息")
    var matrix = Array(repeating: Array(repeating: 0, count: w), count: h)
    for i in 0 ..< h {
        matrix[i] = (readLine() ?? "").split(separator: "").map { Int($0) ?? 0 }
    }
    print("输出描述")
    print("经过 1 的个数,注意初始位置也要计算在内")
    var ans = 0
    while t >= 0 {
        // 注意本题横纵坐标是反的,因此y其实是行号,x是列号
        if matrix[y][x] == 1 {
            ans += 1
        }
        y += sy
        x += sx

        //  注意本题横纵坐标是反的,因此x是列号,w是矩阵列数
        if x < 0 {
            x = 1
            sx = -sx
        } else if x >= w {
            x = w - 2
            sx = -sx
        }

        //  注意本题横纵坐标是反的,因此y是行号,h是矩阵行数
        if y < 0 {
            y = 1
            sy = -sy
        } else if y >= h {
            y = h - 2
            sy = -sy
        }
        t -= 1
    }
    print("\(ans)")
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务