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

题目描述

小王是一名基站维护工程师,负责某区域的基站维护。某地方有n个基站(1 < n < 10),已知各基站之间的距离s(0 < 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
相关推荐
zyl7653 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖7 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌7 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F7 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_307779137 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang03227 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!7 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
2501_926978338 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师8 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构
无定义_8 小时前
10.11日常训练
算法