代码
#include<bits/stdc++.h>
using namespace std;
int r,c,n,x,y,dir[1001][2],f[51][51][1001];
//dir方向,xy坐标
//f[i][j][k]指在第i行第j列第k个方向是否遍历过。
char mapc[51][51],dd[6];
//mpac地图,dd辅助输入
void dfs(int x,int y,int z)//意义同f
{
if(f[x][y][z]||mapc[x][y]=='X'||x<1||x>r||y<1||y>c) return;
f[x][y][z]=1;
int xx=x,yy=y;
if(z==n)
{
while(xx>=1&&xx<=r&&yy>=1&&yy<=c&&mapc[xx][yy]!='X')
mapc[xx][yy]='*',xx+=dir[z][0],yy+=dir[z][1];
return;
}
//不能再改变方向,便一直走到底,标记所有点
xx+=dir[z][0],yy+=dir[z][1];
//不改变方向
dfs(xx,yy,z);
xx=x+dir[z+1][0],yy=y+dir[z+1][1];
//改变方向
dfs(xx,yy,z+1);
}
int main()
{
//freopen("P1189_2.in","r",stdin);
//freopen("1.out","w",stdout);
cin>>r>>c;
for(int i=1;i<=r;++i)
for(int j=1;j<=c;++j)
{
cin>>mapc[i][j];
if(mapc[i][j]=='*')
x=i,y=j,mapc[i][j]='.';
}
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>dd;
switch(dd[0])
{
case 'N':dir[i][0]=-1,dir[i][1]=0;break;
case 'S':dir[i][0]=1,dir[i][1]=0;break;
case 'W':dir[i][0]=0,dir[i][1]=-1;break;
case 'E':dir[i][0]=0,dir[i][1]=1;break;
}
//标记方向
}
f[x][y][1]=1,x+=dir[1][0],y+=dir[1][1];
//据题意至少要向第一个方向走一步
dfs(x,y,1);
for(int i=1;i<=r;++i)
{
for(int j=1;j<=c;++j)
cout<<mapc[i][j];
cout<<endl;
}
return 0;
}
luogu上RE两个点,但是把一个点下载下来自己测却没有问题。有史以来见过最离谱的情况。