出界的路径数(记忆化bfs)

2 篇文章 0 订阅

在这里插入图片描述
记忆化dfs 已遍历过的点他的方案数已知晓 所以无需重新遍历

class Solution {
    int MOD = (int)1e9 + 7;
    int[][][] dp;
    int m1,n1,maxstep=0;
    public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
        m1=m;n1=n;maxstep=maxMove;
        dp=new int[m][n][maxMove+1];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                Arrays.fill(dp[i][j], -1);
            }
        }
        return dfs(0, startRow, startColumn);
    }
   public int dfs(int step, int r, int c) {
        if (r >= m1 || c >= n1 || r < 0 || c < 0) {//越界+1
            return 1;
        }
        if (step >= maxstep) {//步数超限,但没越界应该返回0
            return 0;
        }
        if (dp[r][c][step] != -1) {//表示这个点已经遍历过了,所以无需再次遍历
            return dp[r][c][step];
        }
         dp[r][c][step]= 0;//未遍历的点当前方案数应该初始化置0
         dp[r][c][step]=(dp[r][c][step]+dfs(step + 1, r + 1, c) % MOD)%MOD;
         dp[r][c][step]=(dp[r][c][step]+dfs(step + 1, r - 1, c) % MOD)%MOD;
         dp[r][c][step]=(dp[r][c][step]+dfs(step + 1, r, c + 1) % MOD)%MOD;
         dp[r][c][step]=(dp[r][c][step]+dfs(step + 1, r, c - 1) % MOD)%MOD;
        return  dp[r][c][step];
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值