题目描述
给你一个由'0'
(空地)、'1'
(银矿)、'2'
(金矿)组成的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。
假设银矿价值1,金矿价值2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。
输入描述
地图元素信息如下:
22220
00000
00000
11111
- 地图范围最大
300*300
- 0 <=地图元素 <= 2
输出描述
矿堆的最大价值
用例1
输入:
22220
00000
00000
01111
输出:
8
用例2
输入:
20000
00020
00000
00111
输出
3
Java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
// 地图矩阵
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);
// 读入地图信息
ArrayList<String> lines = new ArrayList<>();
while (sc.hasNextLine()) {
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;
w