地图探险 (CSP-J 2024)
模拟题,文字阅读量较大,首先要认真读完搞清楚题义:地图上的点是方格,地图上有障碍物,机器人从起点开始,沿着某个方向走(表示初始方向,0表示东(右),1表示南(下),2表示西(左),3表示北(上),遇到障碍物或边界则转向(右转90度),直到走完指令要求走过的步数。问地图上被机器人经过的位置有多少个。
注意最后要求的是去重之后的位置数量:“地图上所有被机器人经过的位置(包括起始位置)有多少个”,这里有两种可能的理解,一个是计算重复经过的位置,一个是不计算重复位置,根据"地图上...的位置"的用语,以及例子2(重复经过了(5,2)块),可以明确要去重。
去重的一个简单办法,是经过了的位置,从"."改成另外的字符(比如下面的"#"),"#"可以走但是不计数。
然后一步步模拟应该就可以了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,m,k;
int r0,c0,d0;
int D[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
char s[1005][1005];
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d %d %d", &n, &m, &k);
scanf("%d %d %d", &r0, &c0, &d0);
for (int r = 1; r <= n; r++) {
scanf("%s", s[r]+1);
}
int r = r0, c = c0, d = d0;
int ans = 0;
while (k--) {
if (s[r][c] == '.') {
s[r][c] = '#'; // moved to a unvisited new position
ans++;
}
int nr = r + D[d][0], nc = c + D[d][1];
if (nr < 1 || nr > n || nc < 1 || nc > m || s[nr][nc] == 'x') {
d = (d + 1) % 4; // blocked, turn right
} else {
r = nr; c = nc; // move to new position
}
}
if (s[r][c] == '.') ans++; // count last position
printf("%d\n", ans);
}
return 0;
}