声明:只求用最简单的方法通过,不求优化,不喜勿喷
- dp求解
- 开一个三维的dp数组,第一维代表是的第n步的情况,其余两维代表的是整个m*n数组
- 将第0步的状态初始化为,startRow startColumn对应的那位是1,其余是0
- 之后遍历maxMove-1次(保证还有至少一步是可用的)
- 每次找到 i-1 步时,某位置上下左右的情况,把他们累加起来就是 第 i 步时能走到某位置的情况总数
- 之后检索某个位置上下左右是不是出界,如果出界,那么总数加上能走到这个位置的情况总数
- 记得在0步时也可以计算能不能出界
- 最后输出总数即可
- 优化todo
/**
* @param {number} m
* @param {number} n
* @param {number} maxMove
* @param {number} startRow
* @param {number} startColumn
* @return {number}
*/
var findPaths = function (m, n, maxMove, startRow, startColumn) {
let dp = new Array();
for (var i = 0; i <= maxMove; i++) {
let t = new Array()
for (var j = 0; j < m; j++) {
let t1 = new Array(n).fill(0)
t.push(t1)
}
dp.push(t)
}
dp[0][startRow][startColumn] = 1
let sum = 0;
if(maxMove == 0){
return 0;
}
if (startRow == 0) {
sum += 1
}
if (startRow == m - 1) {
sum += 1
}
if (startColumn == 0) {
sum += 1
}
if (startColumn == n - 1) {
sum += 1
}
for (var i = 1; i < maxMove; i++) {
for (var j = 0; j < m; j++) {
for (var k = 0; k < n; k++) {
let t = 0
if (j > 0) {
t += dp[i - 1][j - 1][k]%1000000007;
}
if (j < m - 1) {
t += dp[i - 1][j + 1][k]%1000000007;
}
if (k > 0) {
t += dp[i - 1][j][k - 1]%1000000007;
}
if (k < n - 1) {
t += dp[i - 1][j][k + 1]%1000000007;
}
dp[i][j][k] = t%1000000007;;
if (j == 0) {
sum += t%1000000007;
}
if (j == m - 1) {
sum += t%1000000007;
}
if (k == 0) {
sum += t%1000000007;
}
if (k == n - 1) {
sum += t%1000000007;
}
}
}
}
return sum % 1000000007;
};