576. 出界的路径数

129 阅读1分钟

576. 出界的路径数

  • var dp1 = new Array(m).fill(0).map(() => new Array(n).fill(0));建立模型,dp1[i][j]代表i,j这个位置走过的次数,默认情况下都为0,起始位置设置为1,所以有dp1[startRow][startColumn] = 1;
  • for (var k = 1; k <= maxMove; k++) { 走动的步数是固定的,我们需要从第一步开始走,然后走第二步,直到走到第maxMove步
  • var dp2 = new Array(m).fill(0).map(() => new Array(n).fill(0));每一个k值情况,都会重置dp2,然后基于dp1生成新的dp2,操作结束后,dp1 = dp2,把新的dp2赋值给dp1,为了下一个循环做准备
  • dp2[i1][j1] = (dp2[i1][j1] + dp1[i][j]) % MOD; 四个方向其中一个,从位置i,ji1,j1没有超出边界,于是要累加一下,因为有可能其他位置到i1,j1,也会生成dp2[i1][j1]
  • count = (count + dp1[i][j]) % MOD; 超出边界了,就累加count
var findPaths = function (m, n, maxMove, startRow, startColumn) {
    var MOD = 1000000007;
    var directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
    var count = 0;
    var dp1 = new Array(m).fill(0).map(() => new Array(n).fill(0));
    dp1[startRow][startColumn] = 1;
    for (var k = 1; k <= maxMove; k++) {
        var dp2 = new Array(m).fill(0).map(() => new Array(n).fill(0));
        for (var i = 0; i < m; i++) {
            for (var j = 0; j < n; j++) {
                if (dp1[i][j] > 0) {
                    for (var direction of directions) {
                        var i1 = i + direction[0], j1 = j + direction[1];
                        if (i1 >= 0 && i1 < m && j1 >= 0 && j1 < n) {
                            dp2[i1][j1] = (dp2[i1][j1] + dp1[i][j]) % MOD;
                        } else {
                            count = (count + dp1[i][j]) % MOD;
                        }
                    }
                }
            }
        }
        dp1 = dp2;
    }
    return count;
};