华为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在线答疑。

相关推荐
AD钙奶-lalala23 分钟前
Mac OS上搭建 http server
java
皮皮林5514 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_456904274 小时前
Spring Boot 用户管理系统
java·spring boot·后端
趁你还年轻_4 小时前
异步编程CompletionService
java
DKPT4 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
sibylyue5 小时前
Guava中常用的工具类
java·guava
奔跑吧邓邓子5 小时前
【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战
java·spring boot·实战·web开发·接口设计
专注API从业者5 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
奔跑吧邓邓子5 小时前
【Java实战㉝】Spring Boot实战:从入门到自动配置的进阶之路
java·spring boot·实战·自动配置
ONLYOFFICE5 小时前
【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中
java·spring boot·编辑器