原题链接: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;}}