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];
}
}