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;
}
}