给定一个 m × n 的网格和一个球。球的起始坐标为 (i,j) ,你可以将球移到相邻的单元格内,或者往上、下、左、右四个方向上移动使球穿过网格边界。但是,你最多可以移动 N 次。找出可以将球移出边界的路径数量。答案可能非常大,返回 结果 mod 109 + 7 的值。
示例 1:
输入: m = 2, n = 2, N = 2, i = 0, j = 0
输出: 6
解释:
示例 2:
输入: m = 1, n = 3, N = 3, i = 0, j = 1
输出: 12
解释:
说明:
球一旦出界,就不能再被移动回网格内。
网格的长度和高度在 [1,50] 的范围内。
N 在 [0,50] 的范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/out-of-boundary-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
final int mod = 1000000007;
public final int findPaths(int m, int n, int N, int i, int j) {
int[][][] cache=new int[m][n][N+1];
for(int x=0;x<m;x++){
for(int y=0;y<n;y++){
for(int z=0;z<N+1;z++){
cache[x][y][z]=-1;
}
}
}
int re=findPaths1(m,n,N,i,j,cache);
return re;
}
public final int findPaths1(int m,int n,int N,int i,int j,int[][][] cache){
if(N<0){
return 0;
}
if(i==m||j==n||i<0||j<0){
return 1;
}
if(cache[i][j][N]==-1){
cache[i][j][N]=0;
cache[i][j][N]+=findPaths1(m,n,N-1,i-1,j,cache);
cache[i][j][N]%=mod;
cache[i][j][N]+=findPaths1(m,n,N-1,i+1,j,cache);
cache[i][j][N]%=mod;
cache[i][j][N]+=findPaths1(m,n,N-1,i,j-1,cache);
cache[i][j][N]%=mod;
cache[i][j][N]+=findPaths1(m,n,N-1,i,j+1,cache);
cache[i][j][N]%=mod;
}
return cache[i][j][N];
}
}