1、对于边界个数,二维矩阵到某个位置的次数等问题,首要考虑dfs
2、本题有三个变数:i,j,N三个都要用作dp变量
在规定的步数内走到边界,可以用递归。但是直接递归会造成超时
在递归的过程中总会走到一些之前已经走过的地方,记录每次走的地方的值,直接返回
因为有步数的限制,所以数组需要使用三维数组(创新点)
注意是走N+1步出界算作是结束条件,所以开辟数组的时候要开辟N+1
代码:
package com.leetCode.dp;
public class leet576 {
/**
* 在规定的步数内走到边界,可以用递归。但是直接递归会造成超时
* 在递归的过程中总会走到一些之前已经走过的地方,记录每次走的地方的值,直接返回
* 因为有步数的限制,所以数组需要使用三维数组(创新点)
* @param args
*/
public static void main(String[] args) {
System.out.println(findPaths(2,2,2,0,0));
}
public static int findPaths(int m, int n, int N, int i, int j) {
int ans=0;
int[][][] dp = new int[m][n][N+1];
for(int a=0;a<m;a++)
for(int b=0;b<n;b++)
for(int c=0;c<=N;c++)
dp[a][b][c]=-1;
ans=find(m,n,N,i,j,dp);
return ans;
}
private static int find(int m, int n, int N, int i, int j, int[][][] dp) {
if(N<0) return 0;//当步数用完了还没有到达边界,返回0
if(i<0||j<0||i==m||j==n) return 1;//到达边界
if(dp[i][j][N]==-1)
{
dp[i][j][N]=0;
dp[i][j][N]+=find(m,n,N-1,i-1,j,dp);
dp[i][j][N]%=1000000007;
dp[i][j][N]+=find(m,n,N-1,i+1,j,dp);
dp[i][j][N]%=1000000007;
dp[i][j][N]+=find(m,n,N-1,i,j-1,dp);
dp[i][j][N]%=1000000007;
dp[i][j][N]+=find(m,n,N-1,i,j+1,dp);
dp[i][j][N]%=1000000007;
}
return dp[i][j][N];
}
}