OD统一考试
分值: 200分
题解: Java / Python / C++
题目描述
给定一个包含 0 和 1 的二维矩阵, 给定一个初始位置和速度。
一个物体从给定的初始位置触发, 在给定的速度下进行移动, 遇到矩阵的边缘则发生镜面反射无论物体经过 0 还是 1,都不影响其速度。
请计算并给出经过t 时间单位后,物体经过 1 点的次数。
矩阵以左上角位置为[0,0](列(x),行(y)),例如坐标为[ 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 个时间单位内经过的点
输入描述
第一行为初始信息
<w> <h> <x> <y> <sx> <sy> <t>
第二行开始一共h行,为二维矩阵信息
其中w,h 为矩阵的宽和高x,y 为起始位置
sx,sy为初始速度t为经过的时间
所有的输入都是有效的,数据范围 如下:
$ 0< w, h <100 $
0 ≤ x < w 0\le x\lt w 0≤x<w
0 ≤ y < h 0 ≤ y \lt h 0≤y<h
− 1 ≤ s x , s y ≤ 1 -1\le sx,sy\le 1 −1≤sx,sy≤1
0 ≤ t ≤ 100 0\le t\le 100 0≤t≤100
输出描述
经过1的个数
注意:初始位置也要计算在内
示例1
输入:
12 7 2 1 1 -1 13
001000010000
001000010000
001000010000
000100001000
001000010000
001000010000
001000010000
输出:
3
说明:
初始位置为(2,1),速度为(1,-1),那么13个时间单位后,经过点1的个数为3
题解
解题思路:
- 读取输入的初始信息和二维矩阵。
- 使用循环模拟物体的运动,根据速度更新物体的位置,如果遇到矩阵边缘则进行反射。
- 在每次移动过程中,如果物体当前位置为1,则将计数器增加。
- 重复上述过程直到达到指定的时间。
- 输出计数器的值,即物体经过1的次数。
代码特点:
- 使用二维数组表示矩阵。
- 通过循环模拟物体的运动。
- 使用条件判断处理边界反射。
这是一个简单的模拟题,主要考察对物体运动轨迹的模拟和条件判断的处理。
Java
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int w = scanner.nextInt(), h = scanner.nextInt();
int x = scanner.nextInt(), y = scanner.nextInt();
int sx = scanner.nextInt(), sy = scanner.nextInt();
int t = scanner.nextInt();
char[][] g = new char[h][w];
for (int i = 0; i < h; i++) {
g[i] = scanner.next().toCharArray();
}
int ans = 0;
do {
if (g[y][x] == '1') ans += 1;
int nx = x + sx;
if (nx < 0 || nx >= w) sx = -sx; // 边界发生反射
int ny = y + sy;
if (ny < 0 || ny >= h) sy = -sy; // 边界发生反射
x += sx;
y += sy;
} while (t-- > 0);
System.out.println(ans);
}
}
Python
w, h, x, y, sx, sy, t = map(int, input().split())
g = [list(input()) for _ in range(h)]
ans = 0
for _ in range(t+1):
if g[y][x] == '1':
ans += 1
nx = x + sx
if nx < 0 or nx >= w:
sx = -sx # 边界发生反射
ny = y + sy
if ny < 0 or ny >= h:
sy = -sy # 边界发生反射
x += sx
y += sy
print(ans)
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int w, h, x, y, sx, sy, t;
cin >> w >> h >> x >> y >> sx >> sy >> t;
vector<vector<char>> g(h, vector<char>(w));
for (int i = 0; i < h; i++) {
string row;
cin >> row;
for (int j = 0; j < w; j++) {
g[i][j] = row[j];
}
}
int ans = 0;
do {
if (g[y][x] == '1') ans += 1;
int nx = x + sx;
if (nx < 0 || nx >= w) sx = -sx; // 边界发生反射
int ny = y + sy;
if (ny < 0 || ny >= h) sy = -sy; // 边界发生反射
x += sx;
y += sy;
} while (t-- > 0);
cout << ans << endl;
return 0;
}
❤️华为OD机试面试交流群(每日真题分享): 加V时备注“华为od加群”
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏