华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。
假设银矿价值1,金矿价值2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。
地图元素信息如下:
22220
00000
00000
11111
矿堆的最大价值
package com.guor.od;
import java.util.*;
public class OdTest {
// 地图矩阵
static int[][] map;
// 上下左右,四个方向的偏移量
static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = Integer.valueOf(sc.nextLine());
// 读入地图信息
ArrayList<String> lines = new ArrayList<>();
for (int i = 0; i < N; i++) {
lines.add(sc.nextLine());
}
// 构建地图矩阵
int rows = lines.size();
int cols = lines.get(0).length();
map = new int[rows][cols];
for (int i = 0; i < rows; i++) {
String line = lines.get(i);
for (int j = 0; j < cols; j++) {
map[i][j] = line.charAt(j) - '0';
}
}
// 记录最大矿堆价值
int maxVal = 0;
// 遍历地图矩阵
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// 如果点(i,j)没有被访问过,且点(i,j)上有矿,则进入深搜
if (map[i][j] > 0) {
LinkedList<int[]> stack = new LinkedList<>();
stack.add(new int[]{i, j});
int sum = 0;
while (!stack.isEmpty()) {
int[] pos = stack.removeLast();
int x = pos[0], y = pos[1];
sum += map[x][y];
map[x][y] = 0;
// 遍历四个方向
for (int[] offset : offsets) {
int newX = x + offset[0];
int newY = y + offset[1];
// 如果新位置在地图范围内,且有矿,则加入栈中
if (newX >= 0 && newX < rows && newY >= 0 && newY < cols && map[newX][newY] > 0) {
stack.add(new int[]{newX, newY});
}
}
}
// 更新最大矿堆价值
maxVal = Math.max(maxVal, sum);
}
}
}
System.out.println(maxVal);
}
}
4
22220
00000
00000
01111
8
下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。