题目来源:https://leetcode-cn.com/problems/out-of-boundary-paths/
大致题意:
给定大小为m*n的方格,一个起始位置坐标,一个能移动的最大步数。求出有多少条路径可以走到方格外部。
思路
动态规划
使用dp[k][i][j]表示,第k步走到坐标(i, j)的路径有多少条。
每次可向上下左右一个方向移动一步,若出界则将路径条数加入答案。
代码:
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
int ans = 0;
final int MOD = 1000000007;
// 代表四个方向
int[][] directions = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
// k i j,第k步到坐标(i, j)的路径数
int[][][] dp = new int[maxMove+1][m][n];
// 注释的代码部分是空间优化过的代码
// int[][] dp = new int[m][n];
// 初始时
dp[0][startRow][startColumn] = 1;
// dp[startRow][startColumn] = 1;
// 遍历
for (int k = 0; k < maxMove; k++) {
// int[][] dpNew = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 获取到达当前位置的路径数
int count = dp[k][i][j];
// int count = dp[i][j];
// 若路径数大于0,也就代表当前路径可到达
if (count > 0) {
// 遍历四个方向
for (int[] direction : directions) {
int row = i + direction[0];
int col = j + direction[1];
// 若未出界
if (0 <= row && row < m && 0 <= col && col < n) {
dp[k][row][col] = (dp[k][row][col] + count) % MOD;
// dpNew[row][col] = (dpNew[row][col] + count) % MOD;
}
// 出界
else {
ans = (ans + count) % MOD;
}
}
}
}
}
// dp = dpNew;
}
return ans;
}