【华为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
相关推荐
AI小老六13 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术14 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize14 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
_清歌3 天前
DSpark 深度解读:DeepSeek-V4 如何用「半自回归」把推理速度提升 85%
算法