[CSP-J2024]T2 地图探险

· · 题解

[CSP-J2024]T2 地图探险

题意

给定一个 nm 列的地图,对于每一个点 (i,j)(1\le i\le n,1\le j \le m),若其字符为 .,则这个位置是空地,否则不是。你现在在其中的一个位置 (x_0,y_0),保证这个位置为空地。你现在面朝 d_0,你要行走 k 次。

对于每一次行走,你要向你面朝的方向行走一步。这就是指,如果 d_0=0,则 x_0\gets x_0,y_0\gets y_0+1;如果 d_0=1,则 x_0\gets x_0+1,y_0\gets y_0;如果 d_0=2,则 x_0\gets x_0,y_0\gets y_0-1;如果 d_0=3,则 x_0\gets x_0-1

然后,对于新的位置 (x_0,y_0),如果当前位置是障碍或 x_0>nx_0<1y_0>my_0<1,则撤销本次移动,令 d_0\gets (d_0+1)\mod 4

现在问你,你能访问到多少个格子?起点也算。

题解

直接模拟。

循环 k 次,每次模拟上面的操作,即:

对于每一次行走,你要向你面朝的方向行走一步。这就是指,如果 d_0=0,则 x_0\gets x_0,y_0\gets y_0+1;如果 d_0=1,则 x_0\gets x_0+1,y_0\gets y_0;如果 d_0=2,则 x_0\gets x_0,y_0\gets y_0-1;如果 d_0=3,则 x_0\gets x_0-1。然后,对于新的位置 (x_0,y_0),如果当前位置是障碍或 x_0>nx_0<1y_0>my_0<1,则撤销本次移动,令 d_0\gets (d_0+1)\mod 4

```cpp #include<bits/stdc++.h> using namespace std; char mp[1010][1010]; int vis[1010][1010]; signed main() { int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); int n,m,k; int x0,y0,d0; scanf("%d%d%d%d%d%d",&n,&m,&k,&x0,&y0,&d0); for(int i=1;i<=n;i++) { scanf("%s",mp[i]+1); } vis[x0][y0]=1; while(k--) { int xn=-1,yn=-1; if(d0==0) { xn=x0; yn=y0+1; } if(d0==1) { xn=x0+1; yn=y0; } if(d0==2) { xn=x0; yn=y0-1; } if(d0==3) { xn=x0-1; yn=y0; } if(xn>=1&&xn<=n&&yn>=1&&yn<=m) { if(mp[xn][yn]=='.') { x0=xn; y0=yn; } else { d0=(d0+1)%4; } } else { d0=(d0+1)%4; } vis[x0][y0]=1; } int cnt=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cnt+=vis[i][j]; } } printf("%d\n",cnt); } } ```