目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。
说明每个点可过多次。
二、输入描述
输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。
说明每个点可过多次。
三、输出描述
经过这些必过点的最小距离是多少。
四、解题思路
利用深度优先搜索来找到所有能够到达的距离,并更新最小距离。
- 目标的点到达最后一个点,更新最小距离;
- 当搜索到的距离大于之前搜索的距离,就不用再搜下去了;
- 拿到当前要去的字符,与所有字符进行比对,如果是相同的就进入下一层递归;
- 选第一个点的时候距离为0;
- 选的点不为第一个点时,加上到达这个点的距离;
- 输出最小距离。
五、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) {// 选第一个点的时候距离为0dfs(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在线答疑。