CSP-J复赛真题解析

CSP历年复赛题-P11228 [CSP-J 2024] 地图探险

原题链接:https://www.luogu.com.cn/problem/P11228

题意解读:n*m地图上’.’是空地,’x’是障碍,初始位置x,y,方向0,1,2,3分别表示向右、下、左、上,初始方向d,对于每一步操作,如果下一个位置不是障碍且没有出界,则走到下一个位置,否则位置不变,方向变成(d+1)%4,记录经过k步操作后一共经过了多少个空位,包括初始位置。

解题思路:

直接模拟即可,经过k迭代,每次计算下一个位置,如果下一个位置出界或是障碍,则方向改变位置不变;

如果没有出界且不是障碍,走到下一个位置并标记,如果该位置之前没有走过,累加经过的位置;

注意起始位置也要累加并标记。

100分代码:

#include <bits/stdc++.h>
using namespace std;

char s[1005][1005];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int vis[1005][1005];
int n, m, k, x, y, d, ans;

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        memset(vis, 0, sizeof(vis));
        cin >> n >> m >> k;
        cin >> x >> y >> d;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++)
                cin >> s[i][j];
        ans = 1;
        vis[x][y] = true;
        while(k--)
        {
            int nx = x + dx[d], ny = y + dy[d];
            if(nx < 1 || nx > n || ny < 1 || ny > m || s[nx][ny] == 'x') 
            {
                d = (d + 1) % 4;
                continue;
            }
            if(!vis[nx][ny])
            {
                ans++;
                vis[nx][ny] = true;
            }
            x = nx, y = ny;
        }
        cout << ans << endl;
    }

}