[CSP-J2024]T2 地图探险
_little_Cabbage_
·
·
题解
[CSP-J2024]T2 地图探险
题意
给定一个 n 行 m 列的地图,对于每一个点 (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>n 或 x_0<1 或 y_0>m 或 y_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>n 或 x_0<1 或 y_0>m 或 y_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);
}
}
```