📜  门| GATE CS Mock 2018 |设置 2 |第 35 题(1)

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

GATE CS Mock 2018 |设置 2 |第 35 题

这道题目考查了程序员的数学知识和代码实现能力。下面是题目内容以及解析。

题目描述

在一个数字矩阵中,给定一个起始节点,每个节点的值可以是1到9中任意一个。我们可以从一个节点出发,每一步可以走到其上方、下方、左边、右边的节点,但是不能走到节点的对角线上的节点。每个节点只能被走一次,如果经过了该节点,权重就是这个节点的值。求从起始节点到所有其他节点的最短路径,并输出路径的权重。

输入格式

输入包含两个部分。第一部分为一个整数n,表示数字矩阵的大小。接下来n行,每行包含n个数字,表示数字矩阵。

第二部分为两个整数x和y,表示起始节点的坐标。

输出格式

输出包含n行,每行n个数字,表示起始节点到该节点的最短路径的权重。如果有任意一点无法到达,则输出-1。

示例输入
3
1 2 3
9 8 4
7 6 5
1 1
示例输出
1 3 6
17 15 10
23 21 16
解析

这道题目可以用BFS(广度优先搜索)来解决。具体实现如下:

from collections import deque

def bfs(matrix, startRow, startCol):
    n = len(matrix)
    visited = [[False for _ in range(n)] for _ in range(n)]
    distance = [[float('inf') for _ in range(n)] for _ in range(n)]
    queue = deque([(startRow, startCol)])
    visited[startRow][startCol] = True
    distance[startRow][startCol] = matrix[startRow][startCol]
    while queue:
        currentRow, currentCol = queue.popleft()
        for row, col in [(currentRow-1, currentCol), (currentRow+1, currentCol), (currentRow, currentCol-1), (currentRow, currentCol+1)]:
            if 0 <= row < n and 0 <= col < n and not visited[row][col]:
                visited[row][col] = True
                distance[row][col] = distance[currentRow][currentCol] + matrix[row][col]
                queue.append((row, col))
    for row in distance:
        if float('inf') in row:
            print("-1")
            return
        print(" ".join([str(x) for x in row]))

代码解读:

  1. 初始化visited和distance数组为False和正无穷,用队列queue来存储待访问的节点。
  2. 将起始节点(startRow, startCol)入队,visited和distance数组对应地进行更新。
  3. 当队列不为空时,每次从队头弹出一个节点,对其能够到达的四个邻居进行遍历。
  4. 如果该邻居没有被访问过,则将其入队,更新visited和distance数组。
  5. 遍历完成后,如果distance数组中仍然有正无穷,则说明存在无法到达的节点,输出-1。

该算法的时间复杂度是O(n^2),其中n是矩阵的大小。

总结

这道题目使用了广度优先搜索算法。在程序员的日常工作中,掌握好算法和数据结构,可以提高编程效率,减少bug的产生。