0
点赞
收藏
分享

微信扫一扫

1470. 水桶传递队列(bfs最短路径)

Resin_Wu 2022-03-30 阅读 38

文章目录

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)
举报

相关推荐

0 条评论