CSP-J 2024 T2 地图探险
题目大意
有一片丛林,其环境可以用一个二维数组表示:
.代表此地为空地,可走。x代表此地非空地,不可走。
有一个机器人探路,他的状态分为两个值:
- 位置。
- 方向。
机器人探路有这样一些规则:
- 若前方有路,直接往前走(不管是否走过)。
- 遇到障碍物,右转。
现在给出机器人的初始状态(一定在空地),求执行k次操作之后,机器人经过了多少地方(右转算一次操作,前进算一次操作)。
思路
需要的变量 / 数组
描述机器人状态需要的3个变量:
x:位置。y:位置。d:朝向(0~3)。
vis数组:
- 当机器人走过[x, y],
vis[x][y] = true。
dir数组:
dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}。[x + dir[d][0], y + dir[d][1]]表示当机器人朝向为d时往前走一步之后的位置。- d = 0: 右 (0, 1)。
- d = 1: 下 (1, 0)。
- d = 2: 左 (0, -1)。
- d = 3: 上 (-1, 0)。
核心思想
vis[x][y] = true;
while (k--) {
int nx = x + dir[d][0], ny = y + dir[d][1]; // 计算下一步的位置
if (!(nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.')) { // 是否能走
d = (d + 1) % 4; // 若不能走 右转
continue;
}
x = nx, y = ny; // 若能走 更新
vis[nx][ny] = true;
}
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e3 + 5;
int n, m, k, x, y, d, dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
char mp[N][N];
bool vis[N][N];
int main() {
int t;
cin >> t;
while (t--) {
memset(vis, false, sizeof (vis));
cin >> n >> m >> k >> x >> y >> d;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> mp[i][j];
vis[x][y] = true;
while (k--) {
int nx = x + dir[d][0], ny = y + dir[d][1];
if (!(nx >= 1 && nx <= n && ny >= 1 && ny <= m && mp[nx][ny] == '.')) {
d = (d + 1) % 4;
continue;
}
x = nx, y = ny;
vis[nx][ny] = true;
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (vis[i][j] == true)
ans++;
}
}
cout << ans << endl;
}
return 0;
}

1377

被折叠的 条评论
为什么被折叠?



