from collections import deque
def bfs(start_x:int, start_y:int, maze:list, n:int, m:int):
dist = [[-1]*m for _ in range(n)]
dist[start_x][start_y] = 0
q = deque()
q.append((start_x, start_y))
while q:
x, y = q.popleft()
for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
nx, ny = x+dx, y+dy
if 0<=nx<n and 0<=ny<m and maze[nx][ny] != '#' and dist[nx][ny] == -1:
dist[nx][ny] = dist[x][y] + 1
q.append((nx, ny))
return dist
def can_connect_by_laser(n: int, m: int, maze: list, dist_S: list, dist_E: list) -> bool:
# 收集S可达点的所有行和列编号
X = set()
Y = set()
for i in range(n):
for j in range(m):
if dist_S[i][j] >= 0:
X.add(i)
Y.add(j)
# 遍历所有E可达点,看其周围行/列是否与S的集合有交集
for i in range(n):
for j in range(m):
if dist_E[i][j] >= 0:
for dx in [-1, 0, 1]:
if 0 <= i + dx < n and (i + dx) in X:
return True
for dy in [-1, 0, 1]:
if 0 <= j + dy < m and (j + dy) in Y:
return True
return False
def main():
n, m = map(int, input().split())
maze = [list(input().strip()) for _ in range(n)]
Sx = Sy = Ex = Ey = -1
for i in range(n):
for j in range(m):
if maze[i][j] == 'S':
Sx, Sy = i, j
maze[i][j] = '.'
elif maze[i][j] == 'E':
Ex, Ey = i, j
maze[i][j] = '.'
dist_S = bfs(Sx, Sy, maze, n, m)
dist_E = bfs(Ex, Ey, maze, n, m)
# 如果起点终点本身连通,无需激光
if dist_S[Ex][Ey] != -1:
print("YES")
return
# 不连通的话,就要判断激光
if can_connect_by_laser(n, m, maze, dist_S, dist_E):
print("YES")
return
else:
print("NO")
return
if __name__ == "__main__":
main()