题目描述:
给定一个包含 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, 也计算在内
2. 时间的最小单位为
输入描述:
第一行为初始信息<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 < 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
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<int>> matrix(h, vector<int>(w));
for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
char cell;
cin >> cell;
matrix[i][j] = cell - '0';
}
}
int count = matrix[y][x]; // 初始化计数,如果起始位置为1,则计数加1
while (t > 0) {
// 更新位置
x += sx;
y += sy;
// 边界碰撞检测及速度调整
if (x < 0 || x >= w) {
sx = -sx;
x += 2 * sx; // 反射后的位置修正
}
if (y < 0 || y >= h) {
sy = -sy;
y += 2 * sy; // 反射后的位置修正
}
// 每经过一个点,检查是否为1,如果是则计数加1
if (matrix[y][x] == 1) {
count++;
}
t--;
}
cout << count << endl;
system("pause");
return 0;
}