题解:闷声大暴力啊啊啊啊
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=55;
int r,c,sx,sy,n;
char s[maxn][maxn],ans[maxn][maxn];
int map[maxn][maxn],vis[maxn][maxn][maxn*200],d[maxn*200];;
int dx[]={0,-1,1,0,0};
int dy[]={0,0,0,-1,1};
void dfs(int x,int y,int t)
{
if(vis[x][y][t]) return ;//判重
vis[x][y][t]=1;
if(!map[x][y]||x>r||y>c||x<1||y<1) return;
if(t>n){
ans[x][y]='*';//找到一个可行点
return;
}
while(map[x][y])//一个指令可以走任意格,所以要用while
{
if(x>r||y>c||x<1||y<1) return;
if(d[t]==1) dfs(--x,y,t+1);
if(d[t]==2) dfs(++x,y,t+1);
if(d[t]==3) dfs(x,--y,t+1);
if(d[t]==4) dfs(x,++y,t+1);
}
}
int main()
{
cin>>r>>c;
for(int i=1;i<=r;i++)
{char ch;
for(int j=1;j<=c;j++)
{ cin>>ch;
if(ch=='.'){map[i][j]=1;ans[i][j]='.';}
if(ch=='X'){map[i][j]=0;ans[i][j]='X';}
if(ch=='*'){
map[i][j]=1;ans[i][j]='.';
sx=i;sy=j;
}
}
}
cin>>n;
for(int i=1;i<=n;i++){
string dire;
cin>>dire;
if(dire[0]=='N') d[i]=1;
if(dire[0]=='S') d[i]=2;
if(dire[0]=='W') d[i]=3;
if(dire[0]=='E') d[i]=4;
}
dfs(sx,sy,1);
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
cout<<ans[i][j];
cout<<endl;
}
}