题目传送门
P11228 [CSP-J 2024] 地图探险
题解思路: 搜索
题目读完,首先应该意识到这是一道考察搜索的题目。只不过限定搜索方向(d表示方向,越界或者碰到障碍物后右转更改方向),限定搜素次数(k限定了走的步数)。
注意
- 这是一道多组测试数据的题,搜索类题目碰上多测试样例,一定要把重复使用的数据进行重置,比如访问数组vis,比如记录访问位置个数的变量cnt。其中重置访问数组vis可使用memset 函数,memset(vis, 0, sizeof(vis)),把数组vis按位全赋值为0。
- 重复访问的位置只计数一次;起始位置也算一个访问位置,开始搜索前要 计数并将vis数组相应位置置为已访问(我第一次提交遗漏了置初始位置为已访问,得了一半分,敲死自己)。
- 这题目右转方向变化的公式已经给出,如果没给出,也要能够推的出来。
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int t, n, m, k, x, y, d;
int dirs[4][2]= {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
char mp[N][N];
bool vis[N][N];
int cnt;
int main() {cin>>t;while(t--) {cin>>n>>m>>k>>x>>y>>d;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>mp[i][j];}}memset(vis, 0, sizeof(vis));cnt=1;vis[x][y]=true;for(int i=1; i<=k; i++) {int nx = x+dirs[d][0];int ny = y+dirs[d][1];if(nx>=1 && nx<=n && ny>=1 && ny<=m && mp[nx][ny]=='.') {if(!vis[nx][ny]){vis[nx][ny]=true;cnt++;} x = nx;y = ny;} else d = (d+1)%4;}cout<<cnt<<endl;}return 0;
}