递归、搜索与回溯-综合练习:27.黄金矿工

题目链接:1219. 黄金矿工(中等)

算法原理:

解法:DFS

枚举矩阵中所以位置为起点来一次dfs,取最大值

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-10-09
 * Time: 12:29
 */
class Solution {
    //1219. 黄金矿工
    boolean[][] check;
    int m,n;
    int max;
    public int getMaximumGold(int[][] grid) {
        m=grid.length;n=grid[0].length;
        max=0;
        check=new boolean[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(!check[i][j]&&grid[i][j]!=0){
                    check[i][j]=true;
                    //2.调用返回总和的dfs,用结果更新max,删除提前返回的return
                    max=Math.max(max,dfs(grid,i,j));
                    check[i][j]=false;
                }
            }
        }
        return max;
    }
    int[] dx=new int[]{0,0,-1,1};
    int[] dy=new int[]{1,-1,0,0};
    //返回值不用boolean,改为int
    public int dfs(int[][] grid,int i,int j){
        int tmp=0;
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x<m&&y<n&&x>=0&&y>=0&&!check[x][y]&&grid[x][y]!=0){
                check[x][y]=true;
                //递归获取后续路径总和,取最大值
                tmp=Math.max(tmp,dfs(grid,x,y));
                check[x][y]=false;
            }
        }
        //返回格子值+后续路径最大值总和
        return grid[i][j]+tmp;
    }
    //看完吴小哲的代码后自己写了一遍,一遍过
    //dfs不用返回值,path作局部变量递归
    boolean[][] check;
    int m,n;
    int ret;
    public int getMaximumGold(int[][] grid) {
        m=grid.length;n=grid[0].length;
        check=new boolean[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(!check[i][j]&&grid[i][j]!=0){
                    check[i][j]=true;
                    dfs(grid,i,j,grid[i][j]);
                    check[i][j]=false;
                }
            }
        }
        return ret;
    }
    int[] dx=new int[]{0,0,1,-1};
    int[] dy=new int[]{-1,1,0,0};
    public void dfs(int[][] grid,int i,int j,int path){
        ret=Math.max(ret,path);
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            if(x<m&&y<n&&x>=0&&y>=0&&!check[x][y]&&grid[x][y]!=0){
                check[x][y]=true;
                dfs(grid,x,y,grid[x][y]+path);
                check[x][y]=false;
            }
        }
    }
}
相关推荐
天空鸟_时光不老10 小时前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis
-dzk-10 小时前
【多维动态规划】LC 1143.最长公共子序列
算法·动态规划
小蒜学长10 小时前
基于SpringBoot+Vue的租房管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·租房管理
C++ 老炮儿的技术栈10 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
洋就在江州10 小时前
gitlab-cicd 离线集成——springboot-cicd (非docker形式,shell形式)
java·spring boot·后端·ci/cd·gitlab·gitlab-runner
Omics Pro10 小时前
全新可重分析!代谢组质谱专用
数据库·人工智能·算法·机器学习·自然语言处理
CEZ10 小时前
JeeWMS 开源 WMS 全景导览:一套 Java 仓库管理系统从单据流到代码入口的阅读地图
java·开源
Nebula_g10 小时前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
一只废狗狗狗狗狗狗狗狗狗10 小时前
Network架构1——卷积神经网络CNN
人工智能·算法·cnn
令狐少侠201110 小时前
centos7 下,使用docker 部署IOT 调试平台,ThingsBoard 并完美启动
java·spring boot·iot