华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。
说明每个点可过多次。
输入一个字符串,都是以大写字母组成,每个相邻的距离是 1,第二行输入一个字符串,表示必过的点。
说明每个点可过多次。
经过这些必过点的最小距离是多少。
利用深度优先搜索来找到所有能够到达的距离,并更新最小距离。
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);
}
}
}
}
}
NEZHALOVESTUDYJAVA
SAZL
10
下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。