反射计数- 华为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
二.解题思路
当解决这个问题时,可以按照以下思路:
- 解析输入: 读取输入,获取矩阵的宽度(w)、高度(h)、初始位置(x, y)、初始速度(sx, sy)以及经过的时间(t)。
- 模拟运动: 使用初始位置和速度,模拟物体的运动。在每个时间单位内,物体的位置按照速度进行更新。同时,考虑边缘情况,如果物体碰到矩阵的边缘,进行镜面反射。
- 计算经过的点: 在每个时间单位内,根据物体的当前位置,判断是否经过了矩阵中的点。如果经过了1点,则计数加一。
- 输出结果: 最终输出在经过给定时间后,物体经过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机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。