题目描述
解题思路
题目大意如下:给你一个m行n列的棋盘,再给你一个足球的初始位置,问在最多走N步(每一步只有向上、向下、向左、向右的方向可以选)的情况下,有多少条路径可以走出棋盘边界。
解题思路如下:因为最多可以走N步,而每一步都有四种方向可以选,如果是穷举的话显得不大可能,这时候可以考虑用动态规划,即要想找到在位置(i,j)最多走N步有多少条路径可以走出边界,可以先找到在位置(i,j)走了一步之后的四种可能位置最多走N-1步有多少条路径可以走出边界。即dp[k][i][j] = sum of dp[k-1][x][y]((x,y)是(i,j)走一步的四种可能位置)
C++代码实现
class Solution {
public:
int findPaths(int m, int n, int N, int i, int j) {
int dp[N+1][m][n];
// 初始化三维数组
for (int k = 0; k < N+1; ++k) {
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
dp[k][i][j] = 0;
}
}
}
for (int k = 1; k < N+1; ++k) { // 最小时走一步 所以k从1开始取值
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
long long up = (i == 0) ? 1 : dp[k - 1][i - 1][j];
long long down = (i == m - 1) ? 1 : dp[k - 1][i + 1][j];
long long left = (j == 0) ? 1 : dp[k - 1][i][j - 1];
long long right = (j == n - 1) ? 1 : dp[k - 1][i][j + 1];
dp[k][i][j] = (up + down + left + right) % 1000000007;
}
}
}
return dp[N][i][j];
}
};
运行结果: