文章目录

Question

阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫。

今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪。

现在研究员们想知道,如果阿尔吉侬足够聪明,它最少需要多少时间就能吃到奶酪。

迷宫用一个 R×C 的字符矩阵来表示。

字符 S 表示阿尔吉侬所在的位置,字符 E 表示奶酪所在的位置,字符 # 表示墙壁,字符 . 表示可以通行。

阿尔吉侬在 1 个单位时间内可以从当前的位置走到它上下左右四个方向上的任意一个位置,但不能走出地图边界。

输入格式
第一行是一个正整数 T,表示一共有 T 组数据。

每一组数据的第一行包含了两个用空格分开的正整数 R 和 C,表示地图是一个 R×C 的矩阵。

接下来的 R 行描述了地图的具体内容,每一行包含了 C 个字符。字符含义如题目描述中所述。保证有且仅有一个 S 和 E。

输出格式
对于每一组数据,输出阿尔吉侬吃到奶酪的最少单位时间。

若阿尔吉侬无法吃到奶酪,则输出“oop!”(只输出引号里面的内容,不输出引号)。

每组数据的输出结果占一行。

数据范围
1<T≤10,
2≤R,C≤200
输入样例:
3
3 4
.S…
###.
…E.
3 4
.S…
.E…

3 4
.S…


…E.
输出样例:
5
1
oop!

Ideas

走迷宫:bfs寻找最少步数,dfs的不能寻找最少步数

Code

t = int(input())

dx=[1,0,-1,0]
dy=[0,-1,0,1]
N=210

def bfs(start,end,r,c):
q = []
dis = [[-1 for i in range(N)] for j in range(N)] # 记录走到该位置移动的距离 和 判断是否走过(-1代表未经过)
dis[start[0]][start[1]] = 0
q.append(start)
while q:
t = q.pop(0) # 队首
for i in range(4):
x=t[0]+dx[i]
y=t[1]+dy[i]
if x<0 or x>=r or y<0 or y>=c: # 越界
continue
if locations[x][y]=='#': # 障碍物
continue
if dis[x][y]==-1: #未走过
dis[x][y]= dis[t[0]][t[1]] + 1
# 走到终点
if x==end[0] and y==end[1]:
return dis[x][y]
else:
q.append((x,y))
else: # 走过
continue
return -1



for i in range(t):
locations = []
r,c = list(map(int,input().strip().split()))
# 读取地图
for i in range(r):
locations.append(list(input().strip()))

# 寻找起点和终点
for i in range(r):
for j in range(c):
if locations[i][j] == 'S':
start = (i,j)
continue
if locations[i][j] == 'E':
end = (i,j)

distance = bfs(start,end,r,c)
if distance == -1:
print('oop!')
else:
print(distance)