//DFS,注意死循环的情况
//http://acm.nyist.net/JudgeOnline/problem.php?pid=1129
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,temp;
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};//
int vis[102][102];
char map[102][102],d;
int check(int x,int y){
if(x>=n||y>=m||x<0||y<0)return 0;
// if(vis[x][y]==1)return 0;
if(map[x][y]=='#')return 0;
return 1;
}
int dfs(int x,int y,int d){
// cout<<x<<' '<<y<<' '<<d<<endl;
if(map[x][y]=='X'){
return 1;
}
for(int i=d,t=0;t<4;t++,i++){
int ds=(i+7)%4;//改变方向
int nx=x+dx[i%4],ny=y+dy[i%4];
if(check(nx,ny)){
if(vis[nx][ny]==4){//vis[nx][ny]==1&&(ds==temp)不对,可能重复走,但是方向和原来不一样
return 0;//但是走第五遍的时候,一定是重复的,和之前四次之一重复,但不一定是原始方向
}
else{
vis[nx][ny]++;
if(dfs(nx,ny,ds)){
return 1;
}
return 0;
}
}
}
return 0;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
getchar();
int a,b;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&map[i][j]);
if(map[i][j]=='T'){
a=i,b=j;
}
}
getchar();
}
scanf("%c",&d);
if(d=='N'){
temp=0;
}
else if(d=='E'){
temp=1;
}
else if(d=='S'){
temp=2;
}
else{
temp=3;
}
if(dfs(a,b,temp)){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
/*
4 4
....
.##.
.#X.
T...
N
4 4
....
.##.
.###
T#.X
N
4 4
....
....
.###
TX..
N
NO
NO
YES
*/
09-03