过河卒
兵从A点走到B点的所有路径方案,且不能经过 “马能吃棋子”的格子。
如果没有马,那么这道题就是一个简单的从A点走到B点的所有路径情况的简单动态规划。
状态转移方程为 dp[i,j] = dp[i - 1,j] + dp[i,j - 1]。
但如果加上了马这个棋子,就需要做出一些额外的判断了,要保证,在判断马所能跳的位置的时候,是不能越界的。
但是 f 的初始数值都是 0,再怎么推也都是 0,要让后面的式子能根据前面的推出来结果,只需要让 dp[1,0] = 1即可。
class Solution {
public:
typedef long long ll;
int crossRiver(int n, int m, int x, int y) {
// 防止越界
n += 2;
m += 2;
x += 2;
y += 2;
// dp数组
ll dp[40][40] = {0};
// 马能跳的位置的数组
int st[40][40] = {0};
// 马能跳的位置
int dy[9] = {0, 1, 2, 2, 1, -1, -2, -2, -1};
int dx[9] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
// dp数组边界初始化
dp[2][1] = 1;
// 对马能走的地方进行一个初始化
for (int i= 0; i < 9; i++) st[x + dx[i]][y + dy[i]] = 1;
// 开始dp
for (int i= 2; i <= n; i++){
for(int j = 2; j <= m; j++){
// 当这个位置马能吃掉棋子的时候
if (st[i][j]) continue;
// 不能吃掉
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[n][m];
}
};