华为OD机考算法题:基站维修工程师

news2024/10/7 8:25:22

题目部分

题目基站维护工程师
难度
题目说明题目说明小王是一名基站维护工程师,负责某区域的基站维护。
某地方有 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
说明
示例2
输入4

0 2 1 3

1 0 2 5

2 1 0 4

3 2 6 0

输出8
说明


解读与分析

题目解读

此题需要计算从第一个基站,遍历所有的基站之后,返回第一个基站,所需要的最小路程。

分析与思路

此题类似八皇后问题,可以使用递归,通过回溯的方式,遍历所有的可能路线。计算所有的路线距离,输出距离最小的路程。

由于要遍历所有的可能路程,此题的时间复杂度为 O(n^{2}),空间复杂度为 O(n)。


代码实现

Java代码

import java.util.Scanner;

import java.util.List;
import java.util.ArrayList;

/**
 * 基站维修工程师
 * @since 2023.10.12
 * @version 0.1
 * @author Frank
 *
 */
public class MinDistance4Maintenance {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String countStr = sc.nextLine();
			int count = Integer.parseInt( countStr );
			int[][] distance = new int[count][];
			for( int i = 0; i < count; i ++ )
			{
				String line = sc.nextLine();
				String[] strNumber = line.split( " " );
				int[] number = new int[count];
				for( int j = 0; j < count; j ++ )
				{
					number[j] = Integer.parseInt( strNumber[j] );
				}
				distance[i] = number;
			}
			
			processMinDistance4Maintenance( distance );
		}

	}

	private static void processMinDistance4Maintenance( int[][] distanceMatrix )
	{
		int minDistance = Integer.MAX_VALUE;
		List<Integer> nodes = new ArrayList<Integer>();
		for( int i = 1; i < distanceMatrix.length; i ++ )
		{
			nodes.add( i );
		}		
		
		for( int i = 0; i < nodes.size(); i ++ )
		{
			int distance = 0;
			int nodeNo = nodes.get( i );
			nodes.remove( i );
			distance = distanceMatrix[0][nodeNo] + getTrackDistance( nodeNo, nodes, distanceMatrix);
			nodes.add( i, nodeNo );
			
			if( distance < minDistance )
			{
				minDistance = distance;
			}
		}
		System.out.println( minDistance );
	}
	
	/**
	 * 
	 * @param startNodeNo	起始节点
	 * @param nodes		剩余要遍历的节点
	 * @param distanceMatrix	距离矩阵
	 * @return	最小距离
	 */
	private static int getTrackDistance( int startNodeNo, List<Integer> nodes, int[][] distanceMatrix )
	{
		if( nodes.size() == 0 )
		{
			return distanceMatrix[startNodeNo][0];
		}
		
		int minDistance = Integer.MAX_VALUE;
		int distance = 0;
		for( int i = 0; i < nodes.size(); i ++ )
		{
			int curNodeNo = nodes.get( i );
			nodes.remove( i );
			distance = distanceMatrix[startNodeNo][curNodeNo] + getTrackDistance( curNodeNo, nodes, distanceMatrix);
			nodes.add( i, curNodeNo );
			
			if( distance < minDistance )
			{
				minDistance = distance;
			}
		}
		return minDistance;
	}
	
}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
            var count = parseInt( line );
            var distance = new Array( count );
            for( var i = 0; i < count; i ++ )
            {
                line = await readline();
                var strNumbers = line.split( " " );
                var numbers = new Array(count);
                for( var j = 0; j < count; j ++ )
                {
                    numbers[j] = parseInt( strNumbers[j] );
                }
                distance[i] = numbers;
            }
            
            processMinDistance4Maintenance( distance );
    }
}();

function processMinDistance4Maintenance( distanceMatrix ) {
        var minDistance = Number.MAX_VALUE;
        var nodes = new Array();
        for( var i = 1; i < distanceMatrix.length; i ++ )
        {
            nodes.push( i );
        }       
        
        for( var i = 0; i < nodes.length; i ++ )
        {
            var distance = 0;
            var nodeNo = nodes[i];
            nodes.splice( i, 1 );
            distance = distanceMatrix[0][nodeNo] + getTrackDistance( nodeNo, nodes, distanceMatrix);
            nodes.splice( i, 0, nodeNo );
            
            if( distance < minDistance )
            {
                minDistance = distance;
            }
        }
        console.log( minDistance );
}

    /**
     * 
     * @param startNodeNo   起始节点
     * @param nodes     剩余要遍历的节点
     * @param distanceMatrix    距离矩阵
     * @return  最小距离
     */
    function getTrackDistance( startNodeNo, nodes, distanceMatrix )
    {
        if( nodes.length == 0 )
        {
            return distanceMatrix[startNodeNo][0];
        }
        
        var minDistance = Number.MAX_VALUE;
        var distance = 0;
        for( var i = 0; i < nodes.length; i ++ )
        {
            var curNodeNo = nodes[i];
            nodes.splice( i, 1 );
            distance = distanceMatrix[startNodeNo][curNodeNo] + getTrackDistance( curNodeNo, nodes, distanceMatrix);
            nodes.splice( i, 0, curNodeNo );
            
            if( distance < minDistance )
            {
                minDistance = distance;
            }
        }
        return minDistance;
    }

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣第669题 修剪二叉搜索树 c++(注释)

题目 669. 修剪二叉搜索树 中等 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元…

实验室超声波清洗机有什么优点?

无论是在工业生产中&#xff0c;还是在日常生活中&#xff0c;清洁工作总是贯穿其中。特别是在社会加工过程中&#xff0c;必须清洗仪器和表面的工作量很大。此外&#xff0c;还有许多人力不能接触到需要清洗的部分&#xff0c;需要使用专业设备进行清洗工作。实验室超声波清洗…

【数值分析】0 - 数值分析绪论

文章目录 一、数值分析介绍二、数值分析应用2.1 解三角函数2.2 计算多项式2.3 解线性方程组2.4 供水计划和生产调度计划的制定2.5 湘江水流量估计的实际意义2.6 机器学习或大数据 三、数值分析内容四、数值分析参考书目 学习视频&#xff1a;《数值分析》| 华科 | 研究生基础课…

C++标准模板(STL)- 类型支持 (数值极限,max_digits10,radix,min_exponent)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4

一 调度模式分类 1.1 调度模式 1.单个任务&#xff1a;一个任务实例便可完成 a)单机单任务&#xff1a;单机模式下任何路由模式都只有一个实例执行 b)集群单任务&#xff1a;由路由策略(广播模式除外)选择其中一个实例完成 2.集群部署&#xff1a;每个实例都同时执行一部分…

RS232电路设计

学习一下RS232的电路设计 在学习过RS485电路设计后&#xff0c;对232就没那么陌生了。 下面我来说一下对于一个新手从0到1 的过程 首先我会查询关于RS232的相关只是&#xff0c;对他有初步了解&#xff0c;在485的基础上很好理解232了。 串口、COM口、UART口, TTL、RS-232、…

尚硅谷Flink(一)

目录 ☄️前置工作 fenfa脚本 &#x1f30b;概述 ☄️Flink是什么 ☄️特点&#xff08;多nb&#xff09; ☄️应用场景&#xff08;不用看&#xff09; ☄️分层API &#x1f30b;配环境 ☄️wordcount ☄️WcDemoUnboundStreaming &#x1f30b;集群部署 ☄️集…

机器视觉工程师为什么要反复调试?

目录 那么程序debug原因有哪些&#xff1f;图像处理debug的原因有哪些&#xff1f; 我们机器视觉项目的程序包含&#xff0c;业务逻辑图像处理&#xff0c;所以我们不单单调试图像处理部分&#xff0c;还要调试C#&#xff0c;界面&#xff0c;数据等等。我们必须保证程序稳定性…

手把手带你用Python和文心一言搭建《AI看图写诗》网页项目(附上完整项目源码)

今年年初&#xff0c;ChatGPT的火爆在全球掀起AI大模型的开发热潮&#xff0c;国内外的科技公司纷纷加入“百模大战”行列。百度在率先发布了国内第一款人工智能大语言模型“文心一言”后&#xff0c;又推出了文心千帆大模型平台&#xff0c;帮助企业和开发者加速大模型应用落地…

ARRI阿莱MXF(ALEXA Mini LF)多碎片重组案例

三大影视巨头ARRI、RED、ATOMOS&#xff0c;ARRI阿莱的设备以提供电影级的画质而在影视圈有很大的名气。ARRI的文件一般是两种&#xff0c;一种是高清MOV&#xff08;苹果为ARRI专门出过特殊认证的编码&#xff09;&#xff1b;一种是高清MXF&#xff1b;相比之下MXF文件比较少…

Vue之Jwt的运用(一起探索JWT在Vue中的用途吧)

目录 前言 一、JWT简介 1. 什么是JWT 2. JWT的工作原理 3. JWT的组成 4. 使用JWT的好处 二、JWT工具类 JwtFilter JwtUtils 工具类的作用 工具类的测试 测试代码 test01()测试结果 test02()测试结果 test03()测试结果 test04测试结果 test05测试结果 三、JWT集成SPA项…

Arya科普 | 程序员常用英语 Java常用名词解释 计算机常用英语汇总

本篇博客汇总了程序员常用的英文单词&#xff0c;Java中常用的名词解释&#xff0c;计算机常用的英语汇总。 英文 A~D array数组 accessible 可存取的 area面积 audio 音频 addition 加法 action 行动 arithmetic 算法 adjustment 调整 actual 真实的 argument 参量 ascent …

CVE-2017-7529 Nginx越界读取内存漏洞

漏洞概述 当使用Nginx标准模块时&#xff0c;攻击者可以通过发送包含恶意构造range域的header请求&#xff0c;来获取响应中的缓存文件头部信息。在某些配置中&#xff0c;缓存文件头可能包含后端服务器的IP地址或其它敏感信息&#xff0c;从而导致信息泄露。 影响版本 Ngin…

Ubutntu 命令行界面显示UI 【FrameBuffer显示GuiLiteSample-Hello3D】

参考资料 https://www.cnblogs.com/jzcn/p/16898249.html https://github.com/idea4good/GuiLiteSamples/tree/master/Hello3D https://github.com/idea4good/GuiLite 显示效果&#xff1a;&#xff08;看看左上角处立方体&#xff09; 使用场景&#xff1a; 嵌入式Linux…

《动手学深度学习 Pytorch版》 8.5 循环神经网络的从零开始实现

%matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps) # 仍然使用时间机器数据集8.…

深度学习验证码项目

项目代码&#xff1a; GitHub - kerlomz/captcha_trainer: [验证码识别-训练] This project is based on CNN/ResNet/DenseNetGRU/LSTMCTC/CrossEntropy to realize verification code identification. This project is only for training the model. GitHub - Python3WebSpi…

锂电池行业新技术,RFID技术赋能生产、溯源

随着新能源汽车用动力电池的快速扩大&#xff0c;对锂电池的发展高安全性、高一致性、高合格率和低制造成本提出了更高的要求。而RFID技术被广泛应用在锂电池行业&#xff0c;为锂电池的生产、管理、溯源等生产管理方面提供了极大地便利&#xff0c;提升了生产效率、产品质量和…

【工具软件】mediamtx——网页、vue3项目中播放 rtsp 视频流(支持265转码)

声明 本文只做 mediamtx 的使用实操&#xff0c;请务必参考下面的博客,&#xff0c;我也参考下面的大佬博客&#xff0c;感谢唯一602的无私分享&#xff1a; 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp mediamtx 介绍 …

Vue的学习补充

1.Vue路由-404 作用&#xff1a;当路径找不到匹配时&#xff0c;给个提示页面 位置&#xff1a;配在路由最后 语法&#xff1a;path:*&#xff08;任意路径&#xff09;-前面不匹配就命中最后这个 2.Vue路由-模式设置 hash路由&#xff08;默认&#xff09; 例如&#xff…

ubuntu mmdetection配置

mmdetection配置最重要的是版本匹配&#xff0c;特别是cuda&#xff0c;torch与mmcv-full 本项目以mmdetection v2.28.2为例介绍 1.查看显卡算力 因为gpu的算力需要与Pytorch依赖的CUDA算力匹配&#xff0c;低版本GPU可在相对高的CUDA版本下运行&#xff0c;相反则不行 算力…