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为经过的时间所有的输入都是有效的,数据范围 如下:输出描述经过1的个数注意:初始位置也要计算在内示例1输入:12 7 2 1 1 -1 13001000010000001000010000001000010000000100001000001000010000001000010000001000010000输出:3说明:初始位置为(2,1),速度为(1,-1),那么13个时间单位后,经过点1的个数为3题解解题思路:读取输入的初始信息和二维矩阵。使用循环模拟物体的运动,根据速度更新物体的位置,如果遇到矩阵边缘则进行反射。在每次移动过程中,如果物体当前位置为1,则将计数器增加。重复上述过程直到达到指定的时间。输出计数器的值,即物体经过1的次数。代码特点:使用二维数组表示矩阵。通过循环模拟物体的运动。使用条件判断处理边界反射。这是一个简单的模拟题,主要考察对物体运动轨迹的模拟和条件判断的处理。Javaimport 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); }}Pythonw, h, x, y, sx, sy, t = map(int, input().split())g = [list(input()) for _ in range(h)]ans = 0for _ 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 += syprint(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;}🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏