递归、搜索与回溯-综合练习:28.不同路径Ⅲ

题目链接:980. 不同路径 III(困难)

算法原理:

解法:DFS

Java代码:

java 复制代码
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-10-09
 * Time: 12:36
 */
class Solution {
    //自己写的,注释处是找的错误:到2就返回+绕过障碍-1
    boolean[][] check;
    int m,n;
    int[] dx=new int[]{0,0,1,-1};
    int[] dy=new int[]{1,-1,0,0};
    int ret,step;
    public int uniquePathsIII(int[][] grid) {
        m=grid.length;n=grid[0].length;
        check=new boolean[m][n];
        //统计一共需要走的步数
        for(int[] tmp:grid){
            for(int x:tmp)
                if(x==0) step++;
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1){
                    check[i][j]=true;
                    dfs(grid,i,j,0);
                    check[i][j]=false;
                }
            }
        }
        return ret;
    }
    public void dfs(int[][] grid,int i,int j,int path){
        if(grid[i][j]==2){
            if(path==step+1) ret++;
            return;//无论是否合法,到终点都要返回
        }
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            //要绕过障碍-1
            if(x<m&&y<n&&x>=0&&y>=0&&!check[x][y]&&grid[x][y]!=-1){
                check[x][y]=true;
                dfs(grid,x,y,path+1);
                check[x][y]=false;
            }
        }
    }
    //吴小哲的解法:开始统计step的时候顺便标记起点,后面就不用两层for循环了
    boolean[][] check;
    int m,n;
    int[] dx=new int[]{0,0,1,-1};
    int[] dy=new int[]{1,-1,0,0};
    int ret,step;
    public int uniquePathsIII(int[][] grid) {
        m=grid.length;n=grid[0].length;
        check=new boolean[m][n];
        //统计一共需要走的步数
        int bx=0,by=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==0) step++;
                    //标记起始位置
                else if(grid[i][j]==1){bx=i;by=j;}
            }
        }
        step+=2;//起点和终点的
        check[bx][by]=true;
        dfs(grid,bx,by,1);
        // for(int i=0;i<m;i++){
        //     for(int j=0;j<n;j++){
        //         if(grid[i][j]==1){
        //             check[i][j]=true;
        //             dfs(grid,i,j,0);
        //             check[i][j]=false;
        //         }
        //     }
        // }
        return ret;
    }
    public void dfs(int[][] grid,int i,int j,int path){
        if(grid[i][j]==2){
            if(path==step) ret++;
            return;//无论是否合法,到终点都要返回
        }
        for(int k=0;k<4;k++){
            int x=i+dx[k],y=j+dy[k];
            //要绕过障碍-1
            if(x<m&&y<n&&x>=0&&y>=0&&!check[x][y]&&grid[x][y]!=-1){
                check[x][y]=true;
                dfs(grid,x,y,path+1);
                check[x][y]=false;
            }
        }
    }
}
相关推荐
yuniko-n几秒前
【JUC】集合线程安全
java
Logic1019 分钟前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi01125 分钟前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
starzy19901 小时前
Flink SlotManager启动流程源码深度剖析:从ResourceManager到Slot分配的完整链路
java·大数据·flink
极光通讯1 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
4SAPI1 小时前
AI API Gateway平台哪个好?从架构视角看企业多模型网关选型与实践
java·大数据·人工智能·gateway·php
EatFan1 小时前
2026 后端 AI 工程化:Spring AI 2.0、MCP 协议与 Agent 内嵌如何收进 Java 生产系统
java·人工智能·spring·agent·spring ai·spring boot 3·mcp
JPower_mr.g1 小时前
SmartCall 音色管理技术解析:基于 SPI 的可扩展音色注册架构
java·开发语言·人工智能·ai·架构·开源
测试开发Kevin1 小时前
IDEA工程结构解析:项目、模块、库、Facet、Artifact (工件) 概念说明
java·ide·intellij idea
大侠归来1 小时前
Spring Boot 2.1 → 3.5 迁移推演:从实战出发的完整路线图
java·spring boot·后端