反射计数- 华为OD统一考试(C卷)

一. 题目-反射计数

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

给定一个初始位置和速度

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

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

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

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

±-------------------------- 递增(x)

| 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

|

递增(y)

注意:

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

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

输入描述:

第一行为初始信息

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

其中

w, h为矩阵的宽和高

x, y为起始位置

sx, sy为初始速度

t为经过的时间

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

0 < w < 100

0 < h < 100

0 <= x < w

0 <= y < w

-1 <= sx <= 1

-1 <= sy <= 1

0 <= t < 100

输出描述:

经过1的个数

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

补充说明:

示例1

输入:

12 7 2 1 1 -1 13

001000010000

001000010000

001000010000

001000010000

001000010000

001000010000

001000010000

输出:

3

说明:

说明:

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

二.解题思路

当解决这个问题时,可以按照以下思路:

  1. 解析输入: 读取输入,获取矩阵的宽度(w)、高度(h)、初始位置(x, y)、初始速度(sx, sy)以及经过的时间(t)。
  2. 模拟运动: 使用初始位置和速度,模拟物体的运动。在每个时间单位内,物体的位置按照速度进行更新。同时,考虑边缘情况,如果物体碰到矩阵的边缘,进行镜面反射。
  3. 计算经过的点: 在每个时间单位内,根据物体的当前位置,判断是否经过了矩阵中的点。如果经过了1点,则计数加一。
  4. 输出结果: 最终输出在经过给定时间后,物体经过1点的次数。

这个问题的关键是正确地模拟物体的运动,并在每个时间单位内判断是否经过1点。通过处理边缘情况,确保物体在矩阵内运动。最终,根据经过的1点的次数得到答案。

三.题解代码

Python题解代码

m,n,y,x,sy,sx,t=map(int,input().split())
g=[]
for _ in range(n):
    g.append(input().strip())
ans=0
while t>=0:
    if g[x][y]=='1':
        ans+=1
    x1,y1=x+sx,y+sy
    if x1<0 or x1>=n:
        sx=-sx
    if y1<0 or y1>=m:
        sy=-sy
    x+=sx
    y+=sy
    t-=1
print(ans)



JAVA题解代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = sc

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试刷题 文章被收录于专栏

华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

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