class Solution {
public:
//f[i][j][s] 代表从位置 i,j 出发,可用步数不超过 s 时的路径数量
const int MOD=1e9+7;
int limit,m,n;
int findPaths(int _m, int _n, int N, int i, int j) {
vector<vector<vector<int>>> dp(_m, vector<vector<int>>(_n, vector<int>(N+1,-1)));
m=_m,n=_n,limit=N;
return dfs(dp,i,j,0);
}
inline long dfs(vector<vector<vector<int>>>& dp,int x, int y, int s) {
if(s > limit) // 大于移动次数,方案不可行
return 0;
if(x < 0 || y < 0 || x >= m || y >= n) // 超出边界范围,达成目标条件
return 1;
if(dp[x][y][s] != -1) // 状态已经计算过了,不需要重复计算
return dp[x][y][s];
// 计算上、下、左、右各个方向寻找出界道路的次数,并保存状态
return dp[x][y][s] = (
dfs(dp , x + 1, y, s + 1) +
dfs(dp , x - 1, y, s + 1) +
dfs(dp , x, y + 1, s + 1) +
dfs(dp , x, y - 1, s + 1)
) % MOD;
}
};
Leetcode - 576 出界的路径数
最新推荐文章于 2024-09-14 22:25:23 发布