📜  门|门 CS 1996 |问题 28(1)

📅  最后修改于: 2023-12-03 15:12:45.908000             🧑  作者: Mango

题目介绍

本题为门|门 CS 1996 国家集训队论文题目,题号为28。该题要求程序员在一个m*n的光棍图中,找出从左侧门到右侧门的最短距离,门用1表示,光棍用0表示,程序员需使用bfs算法解题。

解题思路

题目要求从左侧门到右侧门的最短距离,由于题目给出的图是01矩阵,考虑使用bfs算法,找出从左侧门到右侧门的最短距离,同时记录每个点的距离和是否访问过。

具体算法如下:

  1. 定义队列queue,并将左侧门的位置放入队列中。

  2. 定义距离数组dis和访问数组vis,初始值为0和false。

  3. 进入while(queue不为空)循环

    1. 取出队首元素u,记录距离dis[u]。

    2. 遍历u的所有相邻节点v,如果v未访问,将v放入队列中,同时更新dis[v]=dis[u]+1。

  4. 遍历完成后,dis[n-1]即为左侧门到右侧门的最短距离。

  5. 返回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算法,用于解决光棍图左侧门到右侧门的最短距离问题。