文章目录
Question
农场上起火了,奶牛们正在紧急赶去灭火!
农场可以用一个像这样的 10×10 的字符方阵来描述:
…
…
…
…B…
…
…R…
…
…
…L…
…
字符’B’表示正着火的牛棚,字符’L’表示一个湖,而字符’R’表示农场上的一块巨大岩石。
奶牛们想要沿着一条湖到牛棚之间的路径组成一条“水桶传递队列”,这样她们就可以沿着这条路径传递水桶来帮助灭火。
当两头奶牛在东南西北四个方向上相邻时水桶可以在她们之间传递。
湖边的奶牛也是如此——奶牛只能在紧挨着湖的时候才能用水桶从湖里取水。
类似地,奶牛只能在紧挨着牛棚的时候才能用水去灭牛棚的火。
请帮助求出奶牛们为了组成这样的“水桶传递队列”需要占据的’.’格子的最小数量。
奶牛不能站在岩石所在的方格之内,此外保证牛棚和湖不是相邻的。
输入格式
输入包含 10 行,每行 10 个字符,描述这个农场的布局。
输入保证图案中恰有一个字符’B’、一个字符’L’以及一个字符’R’。
输出格式
输出一个整数,为组成一条可行的水桶传递队列所需要的奶牛的最小数量。
输入样例:
…
…
…
…B…
…
…R…
…
…
…L…
…
输出样例:
7
样例解释
在这个例子中,以下是一个可行的方案,使用了最小数量的奶牛(7):
…
…
…
…B…
…C…
…CC.R…
…CCC…
…C…
…L…
…
Ideas
经典走迷宫最短路径
Code
# 最短路径
locations = []
for i in range(10):
locations.append(input().strip())
dx = [0,0,-1,1]
dy = [1,-1,0,0]
N = 15
distance = [[0 for i in range(N)] for j in range(N)] # 代表走到ij的最短步数 0 代表未走 判重数组
def bfs(start,end):
q = [start]
while q:
t = q.pop(0)
for i in range(4):
x = t[0] + dx[i]
y = t[1] + dy[i]
if not distance[x][y] and 0<=x<=9 and 0<=y<=9 and locations[x][y] != 'R':
distance[x][y] = distance[t[0]][t[1]] + 1
q.append((x,y))
if x == end[0] and y == end[1]:
return distance[x][y]
# 寻找起点与终点
for i in range(10):
for j in range(10):
if locations[i][j] == 'L':
start = (i,j)
if locations[i][j] == 'B':
end = (i,j)
print(bfs(start,end)-1)