当前位置: 首页 > article >正文

华为OD机试2024年真题(基站维修工程师)

基站维修工程师(200分)

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

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

>>输入描述

站点数n和各站点之间的距离(均为整数)。如:

3 {站点数}
0 2 1 {站点1到各站点的路程)
1 0 2 (站点2到各站点的路程}
2 1 0 {站点3到各站点的路程}

>>输出描述

最短路程的数值

>>示例1

输入

3
0 2 1
1 0 2
2 1 0

输出

3

思路: 

目标是解决典型的旅行商问题(TSP, Travelling Salesman Problem),即在一个给定的城市网络中,找到一条从起点城市出发,经过每个城市一次并最终返回起点的路径,使得路径的总距离最短。算法使用了递归(深度优先搜索)结合状态标记来遍历所有可能的路径,并通过回溯法不断比较最短路径。
输入:给定一个 size x size 的二维数组 arr,其中 arr[i][j] 表示城市 i 到城市 j 的距离。
输出:求解从城市0出发,经过每个城市一次并返回的最短路径长度。

 

步骤:
数据输入:读取城市数 size 和城市之间的距离矩阵 arr。
递归函数 recur:递归尝试从一个城市访问未访问过的下一个城市,记录当前路径长度,并使用状态数组 st 标记某个城市是否已经访问过。
状态回溯:递归探索完某条路径后,返回上一步,尝试其他未访问过的城市,最终比较得到最短路径。
结果输出:输出所有路径中的最小总距离。

代码段如下:

package com.rich.huawei.od_test;

import java.util.Scanner;

/**
 * @description
 * @Title Test01
 * @Author tang rui qi
 * @Date 2024/10/14 5:17
 */
public class Test03 {

    static int res; // 用于保存最短路径的总距离

    // 递归函数
    // u: 当前访问的第几个城市
    // pre: 上一个访问的城市编号
    // temRes: 当前路径的总距离
    // size: 城市的总数
    // arr: 城市之间的距离矩阵
    // st: 访问状态数组,标记某个城市是否被访问过
    static void recur(int u, int pre, int temRes, int size, int[][] arr, boolean[] st) {
        // 如果已经访问完所有城市并回到起点城市
        if (u == size - 1) {
            // 将当前路径的总距离与最小距离进行比较,更新最小距离
            res = Math.min(res, temRes + arr[pre][0]);
            return;
        }

        // 遍历每个城市,寻找下一个未访问过的城市
        for (int i = 1; i < size; ++i) {
            if (st[i]) { // 如果该城市已被访问,则跳过
                continue;
            }
            st[i] = true; // 标记该城市为已访问
            // 递归访问下一个城市,并累加当前路径的距离
            recur(u + 1, i, temRes + arr[pre][i], size, arr, st);
            st[i] = false; // 回溯时将该城市重置为未访问状态
        }
    }


    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int size = cin.nextInt(); // 读取城市的总数
        res = 0x3f3f3f3f; // 初始化最短路径为一个很大的值
        int[][] arr = new int[size][size]; // 城市之间的距离矩阵
        boolean[] st = new boolean[size]; // 访问状态数组

        // 读取距离矩阵的值
        for (int x = 0; x < size; ++x)
            for (int y = 0; y < size; ++y) arr[x][y] = cin.nextInt();

        // 从城市0开始递归搜索
        recur(0, 0, 0, size, arr, st);

        // 输出最短路径的总距离
        System.out.println(res);
    }


}


http://www.kler.cn/news/361006.html

相关文章:

  • 【二】企业级JavaScript开发之代码编辑器
  • Vue day06(路由进阶)
  • Segment Routing IPv6简介
  • 《保护你的网站:多维度防护策略分析》
  • AcWing 11 背包问题求方案数
  • 2024第四届中国RPA+AI开发者大赛圆满收官获奖名单公示
  • 小新学习Docker之Docker--harbor私有仓库部署与管理
  • Comsol 低频宽带排气消声器
  • 案例分析:拒绝服务攻击引发的网络调优之旅
  • blender分离含有多个动作的模型,并导出含有材质的fbx模型
  • 软件分享丨火绒应用商店
  • 【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数
  • Leetcode 1857. 有向图中最大颜色值
  • Harmony OS 开发之ArkTS语言基础-类、接口、继承、模块、泛型
  • Vue Data UI——Vue 3 数据可视化组件库
  • 什么是堡垒机 ?
  • Nodes 节点
  • 时间序列预测(六)——循环神经网络(RNN)
  • 07 实战:视频捕获
  • 【系统架构设计师】专题:嵌入式系统考点梳理