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

相关推荐
error:(7 分钟前
【系统与实战双精通】VS Code 调试 ROS2 Python 节点与 Launch 系统指南
android·java·python
Tian_Hang44 分钟前
Eclipse Ditto 的权限策略
java·服务器·前端·网络·ide·ubuntu·eclipse
小蓝波1 小时前
docker 的命令
java·docker·容器
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第155题】【06_Spring篇】第15题:Spring 如何解决循环依赖问题?
java·spring·循环依赖·三级缓存·aop代理
唐青枫2 小时前
Java Maven 实战指南:从 POM、依赖管理到多模块构建
java
硕风和炜2 小时前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索
SamDeepThinking2 小时前
面向对象真正管理的,不是对象,而是依赖
java·后端·程序员
剑挑星河月3 小时前
94.二叉树的中序遍历
java·算法·leetcode
2301_801184753 小时前
docker 工作
java·docker·容器
老前端的功夫3 小时前
【Java从入门到入土】47:构建工具:Maven与Gradle的战争
java·python·maven