地图探险 (CSP-J 2024)

地图探险 (CSP-J 2024)

模拟题,文字阅读量较大,首先要认真读完搞清楚题义:地图上的点是方格,地图上有障碍物,机器人从起点(x0,y0)(x_0,y_0)开始,沿着某个方向走(d0d_0表示初始方向,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;
}