【华为OD机考】华为OD笔试真题解析(7)--基站维修工程师

题目描述

小王是一名基站维护工程师,负责某区域的基站维护。某地方有n个基站(1 < n < 10),已知各基站之间的距离s0 < s < 500),并且基站x到基站y的距离,与基站y到基站x的距离并不一定会相同。

小王从基站1出发,途径每个基站1次,然后返回基站1,需要请你为他选择一条距离最短的路径。

输入描述

第一行表示站点数,以后各行表示站点数n到各站点之间的距离(均为整数)。

text 复制代码
3
0 2 1
1 0 2
2 1 0

输出描述

最短路径的数值。

示例描述

示例一

输入:

text 复制代码
3
0 2 1
1 0 2
2 1 0

输出:

text 复制代码
3

解题思路

  1. 本题采用可放回的回溯法。
  2. 由于固定从基站1开始,可设置初始路径列表为[0],路径长度和路径节点一致,使用回溯法得到所有可能的路径。
  3. 根据得到的路径,计算路径长度,得到最小路径。

解题代码

python 复制代码
import math


def solve_method(num, paths):
    result = []
    backstracking(num, num, 1, [0], result)

    min_path = math.inf
    for path in result:
        total_path = 0
        prev = 0
        for p in path:
            # 计算路径长度
            total_path += paths[prev][p]
            prev = p

        if total_path < min_path:
            min_path = total_path
    return min_path


def backstracking(n, k, start_index, path, result):
    if len(path) == k:
        tmp = path[:]
        tmp.append(0)
        result.append(tmp)
        return

    # 采用放回的取数方式
    for i in set(range(n)).difference(set(path)):
        path.append(i)
        backstracking(n, k, i + 1, path, result)
        path.pop()


if __name__ == '__main__':
    num = 3
    paths_length = [
        [0, 2, 1],
        [1, 0, 2],
        [2, 1, 0],
    ]
    assert solve_method(num, paths_length) == 3
相关推荐
花心蝴蝶.1 小时前
JVM 垃圾回收
java·jvm·算法
im_AMBER1 小时前
hello算法笔记 02
笔记·算法
Michelle80232 小时前
决策树习题
算法·决策树·机器学习
hn小菜鸡2 小时前
LeetCode 2540.最小公共值
数据结构·算法·leetcode
Tisfy2 小时前
LeetCode 0611.有效三角形的个数:双指针
算法·leetcode·题解·双指针
Keying,,,,2 小时前
力扣hot100 | 多维动态规划 | 62. 不同路径、64. 最小路径和、5. 最长回文子串、1143. 最长公共子序列、72. 编辑距离
算法·leetcode·动态规划
lifallen2 小时前
Flink Watermark机制解析
大数据·算法·flink
IT古董2 小时前
【第五章:计算机视觉-项目实战之目标检测实战】1.目标检测算法理论-(6)一阶段目标检测算法YOLO系列思想详解:YOLOV1~YOLOV10
算法·目标检测·计算机视觉
小旺不正经2 小时前
数据库表实现账号池管理
数据库·后端·算法
豆芽8193 小时前
模糊控制Fuzzy Control
人工智能·算法·模糊控制