📅  最后修改于: 2023-12-03 15:12:45.908000             🧑  作者: Mango
本题为门|门 CS 1996 国家集训队论文题目,题号为28。该题要求程序员在一个m*n的光棍图中,找出从左侧门到右侧门的最短距离,门用1表示,光棍用0表示,程序员需使用bfs算法解题。
题目要求从左侧门到右侧门的最短距离,由于题目给出的图是01矩阵,考虑使用bfs算法,找出从左侧门到右侧门的最短距离,同时记录每个点的距离和是否访问过。
具体算法如下:
定义队列queue,并将左侧门的位置放入队列中。
定义距离数组dis和访问数组vis,初始值为0和false。
进入while(queue不为空)循环
取出队首元素u,记录距离dis[u]。
遍历u的所有相邻节点v,如果v未访问,将v放入队列中,同时更新dis[v]=dis[u]+1。
遍历完成后,dis[n-1]即为左侧门到右侧门的最短距离。
返回dis[n-1]。
def bfs(graph):
n,m = len(graph),len(graph[0])
queue = [(0,0)]
dis = [[0]*m for _ in range(n)]
vis = [[False]*m for _ in range(n)]
vis[0][0] = True
while queue:
u,v = queue.pop(0)
if (u == n-1) and (v == m-1):
return dis[n-1][m-1]
for x,y in [(u+1,v),(u-1,v),(u,v+1),(u,v-1)]:
if 0<=x<n and 0<=y<m and not vis[x][y] and graph[x][y]:
vis[x][y] = True
queue.append((x,y))
dis[x][y] = dis[u][v] + 1
return -1
该代码实现了bfs算法,用于解决光棍图左侧门到右侧门的最短距离问题。