给你一个大小为 m x n
的网格和一个球。球的起始坐标为 [startRow, startColumn]
。你可以将球移到在四个方向上相邻的单元格内(可以穿过网格边界到达网格之外)。你 最多 可以移动 maxMove
次球。
给你五个整数 m
、n
、maxMove
、startRow
以及 startColumn
,找出并返回可以将球移出边界的路径数量。因为答案可能非常大,返回对 109 + 7
取余 后的结果。
示例 1:
输入:m = 2, n = 2, maxMove = 2, startRow = 0, startColumn = 0 输出:6
示例 2:
输入:m = 1, n = 3, maxMove = 3, startRow = 0, startColumn = 1 输出:12
提示:
1 <= m, n <= 50
0 <= maxMove <= 50
0 <= startRow < m
0 <= startColumn < n
C++
class Solution {
public:
int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
int mod = 1000000007;
int ans = 0;
vector<vector<vector<int>>> tmp(maxMove+1, vector<vector<int>>(m, vector<int>(n, 0)));
tmp[0][startRow][startColumn] = 1;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };
for (int k = 0; k < maxMove; k++) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int count = tmp[k][i][j];
if (count > 0) {
for (int s = 0; s < 4; s++) {
int y = i + dy[s];
int x = j + dx[s];
if (y >= 0 && y < m && x >= 0 && x < n) {
tmp[k + 1][y][x] = (tmp[k + 1][y][x] + count) % mod;
}
else {
ans = (ans+count) % mod;
}
}
}
}
}
}
return ans;
}
};
java
class Solution {
public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) {
int[][][] dp = new int[maxMove + 1][m][n];
dp[0][startRow][startColumn] = 1;
int ans = 0;
int mod = 1000000007;
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
for (int k = 0; k < maxMove; k++) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int num = dp[k][i][j];
if (num > 0) {
for (int s = 0; s < 4; s++) {
int y = i + dy[s];
int x = j + dx[s];
if (y >= 0 && y < m && x >= 0 && x < n) {
dp[k + 1][y][x] = (dp[k + 1][y][x] + num) % mod;
} else {
ans = (ans + num) % mod;
}
}
}
}
}
}
return ans;
}
}
python
class Solution:
def findPaths(self, m: int, n: int, maxMove: int, startRow: int, startColumn: int) -> int:
dp = [[[0 for j in range(n)] for i in range(m)] for k in range(1 + maxMove)]
dp[0][startRow][startColumn] = 1;
ans = 0
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
for k in range(maxMove):
for i in range(m):
for j in range(n):
num = dp[k][i][j]
if num > 0:
for s in range(4):
y = i + dy[s]
x = j + dx[s]
if y >= 0 and y < m and x >= 0 and x < n:
dp[k + 1][y][x] += num
else:
ans += num
return ans%1000000007