【华为OD机试2023】基站维修工程师 Java

本文介绍了华为OD机试中的一道题目,涉及基站维修工程师如何找到一条从基站1出发,途径所有基站一次,最后返回基站1的最短路线问题。通过Java代码实现DFS搜索回溯算法来求解此问题,给出具体输入输出示例及思路解析。
摘要由CSDN通过智能技术生成

基站维修工程师

代码仅供参考,若需使用请进行一定修改,本文提供java代码

题目

题目描述

小王是一名基站维护工程师,负责某区域的基站维护。

某地方有八个基站 (1<n<10),已知各基站之间的距离s (0<s<500),并旦基站x到基站y的距离,与

基站y到基站x的距离并不一定会相同。

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

输入描述

站点数n和各个站点之间的距离

输出描述

最短的路线的距离

补充说明

示例

输入

3

0 2 1

1 0 2

2 1 0

输出

3

思路

dfs搜索回溯即可

代码

import java.util.*;

public class Main{

    public static int min = Integer.MAX_VALUE;
    static int M=100005;
    static int vis[]=new int[M];


    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        for(int i=1;i<M;i++) vis[i]=vis[i-1]+vis[i];
        int n = sc.nextInt();
        sc.nextLine();
        int[][] dis = new int[n][n];
        for(int i=0; i<n; i++){
          for(int j=0; j<n; j++){
            dis[i][j] = sc.nextInt();
          }
        }
        for(int i=1;i<M;i++) vis[i]=vis[i-1]+1;

        for(int i=1; i<dis.length; i++){
              vis[i]=dis[0][i];
              List<Integer> STList = new ArrayList<>();
              STList.add(i);
              dis( dis, i, STList, dis[0][i]);
              if(vis[0]!=0) vis[0]=0;
            }
            System.out.println(min+vis[0]);
        }

    public static void dis(int[][] ints, int id, List<Integer> ST, int sum){

        if(ST.size() + 1 == ints.length){
          min = Math.min( min, sum + ints[id][0]);
          return;
        }
        for(int i=1; i<ints.length; i++){
          if(ST.contains(i)){
            vis[i]=i;
            continue;
          }
          ST.add(i);
          dis(ints, i, ST, sum + ints[id][i]);
          ST.remove(ST.size()-1);
          vis[i]=0;
          if(vis[i]==0)
            vis[i]+=1;
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abmcar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值