华为OD机试 - 找出经过特定点的路径长度 - 深度优先搜索(Java 2022 Q4 100分)

目录

华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。

说明每个点可过多次。

二、输入描述

输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。

说明每个点可过多次。

三、输出描述

经过这些必过点的最小距离是多少。

四、解题思路

利用深度优先搜索来找到所有能够到达的距离,并更新最小距离。

  1. 目标的点到达最后一个点,更新最小距离;
  2. 当搜索到的距离大于之前搜索的距离,就不用再搜下去了;
  3. 拿到当前要去的字符,与所有字符进行比对,如果是相同的就进入下一层递归;
    • 选第一个点的时候距离为0;
    • 选的点不为第一个点时,加上到达这个点的距离;
  4. 输出最小距离。

五、Java算法源码

java 复制代码
package com.guor.od;

import java.util.*;

public class OdTest {
    public static char[] allPoint;
    public static char[] movePoint;
    public static int ans;
    public static int[][] minPointDistance;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        allPoint = str.toCharArray();
        str = sc.nextLine();
        movePoint = str.toCharArray();
        ans = Integer.MAX_VALUE;
        minPointDistance = new int[movePoint.length][allPoint.length];
        for(int i = 0; i < minPointDistance.length; i++) {
            for(int j = 0; j < allPoint.length; j++) {
                minPointDistance[i][j] = Integer.MAX_VALUE;
            }
        }

        dfs(0, 0, 0);
        System.out.println(ans);
    }

    /**
     * 利用深度优先搜索来找到所有能够到达的距离,并更新最小距离
     * @param index             目标点下标
     * @param nowDistance       当前已经走过的距离
     * @param nowPointIndex     当前出发的点下标
     */
    public static void dfs(int index, int nowDistance, int nowPointIndex){
        if(index >= movePoint.length) {
            // 目标的点到达最后一个点,更新最小距离
            ans = Math.min(ans, nowDistance);
            return ;
        }

        // 优化:minPointDistance中存的是,到达目标点的最小距离,
        // 例如minPointDistance[3][2]:当前到第3个点,位置在2的最小距离
        // 当搜索到的距离大于之前搜索的距离,就不用再搜下去了
        if(minPointDistance[index][nowPointIndex] < nowDistance) {
            return ;
        }
        minPointDistance[index][nowPointIndex] = nowDistance;

        //  拿到当前要去的字符,与所有字符进行比对,如果是相同的就进入下一层递归
        char tarPoint = movePoint[index];
        for(int i = 0; i < allPoint.length; i++) {
            if(allPoint[i] == tarPoint) {
                if(index == 0) {
                    //  选第一个点的时候距离为0
                    dfs(index + 1, 0, i);
                }
                else {
                    //  选的点不为第一个点时,加上到达这个点的距离
                    dfs(index + 1, nowDistance + Math.abs(i - nowPointIndex), i);
                }
            }
        }
    }
}

六、效果展示

1、输入

NEZHALOVESTUDYJAVA

SAZL

2、输出

10

3、说明

🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
年老体衰按不动键盘20 分钟前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖25 分钟前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
liuyang-neu29 分钟前
java内存模型JMM
java·开发语言
UFIT1 小时前
NoSQL之redis哨兵
java·前端·算法
刘 大 望1 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql
怀旧,1 小时前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
大春儿的试验田2 小时前
Parameter ‘XXX‘ not found. Available parameters are [list, param1]
java
程序员JerrySUN2 小时前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
2302_809798322 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
网安INF3 小时前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞