华为机考真题 -- 反射计数

题目描述:

给定一个包含 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值