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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

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

专栏导读

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

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

一、题目描述

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

说明每个点可过多次。

二、输入描述

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

说明每个点可过多次。

三、输出描述

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

四、解题思路

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

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

五、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 2022 Q4 100分)_第1张图片

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


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

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

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

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,深度优先,java,学习方法,送书)