华为OD机试真题【寻找最大价值的矿堆】

news/2024/7/20 21:06:01 标签: 算法, 深度优先, java

1、题目描述

【寻找最大价值的矿堆】
给你一个由 ‘0’(空地)、’1’(银矿)、’2’(金矿)组成的的地图,
矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。
假设银矿价值1 ,金矿价值2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。
**【输入描述】**地图元素信息如下:
22220
00000
00000
11111
地图范围最大 300*300
0<= 地图元素 <= 2
【输出描述】 矿堆的最大价值
8
【输入】
22220
00000
00000
01111
【输出】
8
【输入】
22220
00020
00010
01111
【输出】
15

2、解题思路

此题与【岛屿的最大面试】题类似,可用dfs回溯遍历的方法感染矩阵的位置即将符合题意的方向的1都变成0,统计需要多少次才能将矩阵中所有的值都变成0。

3、参考代码

java">import java.util.Arrays;
import java.util.Scanner;

/**
 * @Author
 * @Date 2023/6/11 10:15
 */
public class 寻找最大价值的矿堆 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = Integer.parseInt(in.nextLine());
            int[][] array = new int[n][];
            for (int col = 0; col < n; col++) {
                array[col] = Arrays.stream(in.nextLine().split(""))
                        .mapToInt(Integer::parseInt).toArray();
            }

            int maxValue = 0;
           // int maxSum = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if (array[i][j] != 0) {
                        maxValue = Math.max(maxValue, dfs(array, i, j));
                        // maxSum = Math.max(maxSum, dfs(array, i, j, 0));
                    }
                }
            }

            System.out.println(maxValue);
            //System.out.println(maxSum);
        }
    }

    // 方法一:
    public static int dfs(int[][] array, int i, int j) {
        if (i < 0 || j < 0 || i >= array.length || j >= array[i].length || array[i][j] == 0) {
            return 0;
        }

        int sum = array[i][j];
        array[i][j] = 0;
        sum += dfs(array, i + 1, j);
        sum += dfs(array, i - 1, j);
        sum += dfs(array, i, j + 1);
        sum += dfs(array, i, j - 1);
        return sum;
    }

    // 方法二:
    public static int[][] distances = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    public static int dfs(int[][] array, int i, int j, int maxSum) {
        if (i < 0 || j < 0 || i >= array.length || j > array[i].length || array[i][j] == 0) {
            return maxSum;
        }
        maxSum += array[i][j];
        array[i][j] = 0;
        for (int[] dis : distances) {
            int newI = i + dis[0];
            int newJ = j + dis[1];

            if (newI < 0 || newJ < 0 || newI >= array.length || newJ >= array[newI].length || array[newI][newJ] == 0) {
                continue;
            }
            maxSum = dfs(array, newI, newJ, maxSum);
        }

        return maxSum;
    }

}

4、相似题目

(1)岛屿的面积

java">	//可以看图理解,在加上记住这个模板。
    public int maxAreaOfIsland(int[][] grid) {
        //定义一个表示岛屿的面积
        int max = 0;
        //这两个for循环是来遍历整张二维格上的所有陆地的。
        //i 表示行,j表示列
        for(int i = 0;i<grid.length;i++){
            for(int j = 0; j<grid[0].length;j++){
                //陆地的格
                if(grid[i][j]==1){
                    //取出最大的面积
                    max = Math.max(max,dfs(grid,i,j));
                }  
            }
        }
        //返回最大的陆地面积
        return max;
    }
    public int  dfs(int[][] grid,int i,int j){
        //当超出岛屿边界(上下左右)的时候,就直接退出,特别要加上当遍历到海洋的时候也要退出,
        if(i<0||j<0 || i>=grid.length || j>= grid[0].length|| grid[i][j]==0) return 0;
       //定义一个变量表示岛屿的面积,就是包含几个陆地
        int sum = 1;
        //将陆地改为海洋,防止重复陆地重复遍历。
        grid[i][j] =0;
        //遍历上方元素,每遍历一次陆地就加一
        sum += dfs(grid,i+1,j);
        //遍历下方元素
        sum +=dfs(grid,i-1,j);
        //遍历右边元素
        sum +=dfs(grid,i,j+1);
        //遍历左边元素
        sum += dfs(grid,i,j-1);
        return sum;
    }

http://www.niftyadmin.cn/n/5013765.html

相关文章

15. 线性代数 - 克拉默法则

文章目录 克拉默法则矩阵运算Hi,大家好。我是茶桁。 上节课我们在最后提到了一个概念「克拉默法则」,本节课,我们就来看看到底什么是克拉默法则。 克拉默法则 之前的课程我们一直在强调,矩阵是线性方程组抽象的来的。那么既然我们抽象出来了,有没有一种比较好的办法高效…

Java开发之Redis核心内容【面试篇 完结版】

文章目录 前言一、redis使用场景1. 知识分布2. 缓存穿透① 问题引入② 举例说明③ 解决方案④ 实战面试 3. 缓存击穿① 问题引入② 举例说明③ 解决方案④ 实战面试 4. 缓存雪崩① 问题引入② 举例说明③ 解决方案④ 实战面试 5. 缓存-双写一致性① 问题引入② 举例说明③ 解决…

【TypeScript】一直提示 :无法重新声明块范围变量

【TypeScript】一直提示 &#xff1a;无法重新声明块范围变量 问题描述&#xff1a;在VSCode中编写ts代码时&#xff0c;编写保存完之后&#xff0c;通过tsc 文件名.ts编译就会看到变量名下面出现了红色的波浪线&#xff0c;提示的内容是无法重新声明块范围变量。 解决方法&am…

DIM层维度表学习之用户维度表分析

1.用户维度表的模型 DROP TABLE IF EXISTS dim_user_zip; CREATE EXTERNAL TABLE dim_user_zip (id STRING COMMENT 用户ID,name STRING COMMENT 用户姓名,phone_num STRING COMMENT 手机号码,email STRING COMMENT 邮箱,user_level STRING COM…

zustand实践与源码阅读

如何管理数据? 日常使用&#xff1a;发布订阅、context、redux… zustand是一个轻量、快速、可扩展的状态管理库。 目前在社区非常流行&#xff0c;现在github上有30K的star。npm包的下载量&#xff0c;现在也仅次于redux&#xff0c;位于mobx之上&#xff0c;并且差距日益扩大…

【Linux】工具GCC G++编译器轻度使用(C++)

目录 一、关联知识背景 二、GCC如何的编译过程 【2.1】预处理(进行宏替换) 【2.2】编译(生成汇编) 【2.3】连接(生成可执行文件或库文件) 三、GCC命令的常用选项 四、动静态链接 一、关联知识背景 gcc 与 g 分别是 gnu 的 c & c 编译器 gcc/g 在执行编译工作的时候…

你真的懂分数吗?(三)——带分数到小数到百分数

早点关注我&#xff0c;精彩不错过&#xff01; 上回我们从分数模型聊到了最简分数的应用&#xff0c;相关内容请戳&#xff1a;、 你真的懂分数吗&#xff1f;&#xff08;二&#xff09;——分数模型应用初探 你真的懂分数吗&#xff1f;&#xff08;一&#xff09;——分数的…

记一次诡异的Cannot find declaration to go to,Cannot resolve method

记一次诡异的 Cannot find declaration to go to&#xff0c; Cannot resolve method getOnExpressions in Join 对于项目中通常问题&#xff0c;清除缓存&#xff0c;重启idea&#xff0c;或者仔细检查语法通常都能解决问题&#xff0c;但是这次却失效了&#xff0c;以下是原…