目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、Java算法源码
- 五、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。
假设银矿价值1,金矿价值2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。
二、输入描述
地图元素信息如下:
22220
00000
00000
11111
- 地图范围最大 300*300
- 0 <=地图元素 <= 2
三、输出描述
矿堆的最大价值
四、Java算法源码
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);}
}
五、效果展示
1、输入
4
22220
00000
00000
01111
2、输出
8
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。