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

相关推荐
艾莉丝努力练剑1 天前
【AI大模型接入SDK】Gemini模型接入知识体系
java·开发语言·网络·人工智能·网络协议·学习·http
云运维笔记1 天前
Zabbix 分布式监控搭建实战:基于 Proxy 实现 MySQL、Java、Nginx 监控
java·mysql·zabbix
zhanghaha13141 天前
Python进阶教程:28_queue 队列模块 零基础超详细教程
java·开发语言·python
司小豆1 天前
第七课:DeepSeek Harness 服务与依赖注入
java·服务器·开发语言·github·ai编程
许彰午1 天前
24-MyBatisHelper与autoCount
java·低代码·架构
CRMEB系统商城1 天前
汽车养护连锁的数字化底座CRMEB 多门店系统实战方案
java·开发语言·小程序·开源·汽车
学编程就要猛1 天前
使用Spring AI配置聊天大模型实现人机交互(初阶)
java·spring ai·advisor·chatclient·chatmodel
代码不停1 天前
子序列问题
java·算法
计算机学姐1 天前
基于SpringBoot的高校爱心慈善管理系统
java·vue.js·spring boot·后端·spring·tomcat·mybatis
大梦想家a1 天前
基于Servlet+JSP的小区物业管理系统设计与实现(Bootstrap+MySQL)
java·servlet·bootstrap