from collections import deque # 导入deque模块,用于实现队列数据结构
dx = [-1, 0, 1, 0] # 定义x方向的偏移量,分别表示上、右、下、左
dy = [0, 1, 0, -1] # 定义y方向的偏移量,分别表示上、右、下、左
def bfs(start, end):
# 初始化距离数组为-1,表示未访问过
dist = [[-1] * m for _ in range(n)]
# 起点到自身的距离为0
dist[start[0]][start[1]] = 0
# 使用deque实现队列,初始将起点加入队列中
q = deque([start])
# BFS搜索过程
while q:
# 取出队列中的第一个元素
t = q.popleft()
# 遍历当前位置的四个邻居节点
for i in range(4):
a, b = t[0] + dx[i], t[1] + dy[i]
# 如果邻居节点越界或者已经访问过,跳过当前循环
if a < 0 or a >= n or b < 0 or b >= m:
continue
if dist[a][b] != -1: # 说明可以走
continue
# 如果邻居节点是障碍物,跳过当前循环
if g[a][b] == '#':
continue
# 更新邻居节点的距离,并加入队列中
dist[a][b] = dist[t[0]][t[1]] + 1
# 如果邻居节点是终点,返回最短路径长度
if (a, b) == end:
return dist[a][b]
q.append((a, b))
# 如果无法到达终点,返回-1
return -1
# 读取测试样例数量
T = int(input())
# 遍历每个测试样例
for _ in range(T):
# 读取迷宫的行数和列数
n, m = map(int, input().split())
# 读取迷宫的每一行
g = [input() for _ in range(n)] # 读入的是字符串
start, end = None, None
# 查找起点和终点的位置
for i in range(n):
for j in range(m):
if g[i][j] == 'S':
start = (i, j) # 元组
elif g[i][j] == 'E':
end = (i, j)
# 使用BFS计算最短路径长度,并打印结果
distance = bfs(start, end)
if distance == -1:
print("oop!")
else:
print(distance)