/*第一次写搜索,迷宫类型题,搜索题大部分是递归的嵌套,这题是典型的位置移动题,可以单独开一个数组来存位置移动的坐标,int dir[][],分别为上下左右,是根据不撞南墙不回头,一撞南墙就回头,通过搜索找到这个目标是否可以,当全部走过就可以确定是否能找到这个目标点*/
#include<stdio.h>
#include<string.h>
int n, m;
int sx, sy, ex, ey;
int flag;
int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };//方位定位;
int vis[520][520]; //标记的路是否做过,走过的路不在走;
char str[520][520];
void dfs(int px, int py) {
vis[px][py] = 1;
if ( px == ex && py == ey) flag = 1;
for (int i = 1; i <= 4; i++) {
int xx = px + dir[i][0]; //计算新的坐标;
int yy = py + dir[0][i];
if (str[xx][yy] != '#' && !vis[xx][yy] && xx < n && xx >= 0 && yy < m && yy >= 0) {
dfs(xx, yy); //判断这个点是不是ex,ey;
}
}
}
int main() {
while (~scanf("%d%d", &n, &m)) {
memset(vis, 0, sizeof(vis));
flag = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf(" %c", &str[i][j]);
if (str[i][j] == 'S') {
sx = i;
sy = j;
}
if (str[i][j] == 'E') {
ex = i;
ey = j;
}
}
}
dfs(sx, sy);
if (flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}