#Z5009. 实现马踏过河卒
实现马踏过河卒
#include <iostream>
using namespace std;
int dir[8][2] = {{1, 2}, {1, -2}, {2, 1}, {2, -1}, {-1, 2}, {-1, -2}, {-2, 1}, {-2, -1}};
int main() {
int n, m, cx, cy;
// n, m 是棋盘大小,cx, cy 是马的位置
cin >> n >> m >> cx >> cy;
return 0;
}
我们用一个数组d[i][j]
来标记马的控制点,卒是不能通过的。
在main函数cin >> n >> m >> cx >> cy;
下面写下
if(d[i][j]==false) {
if(i) {
dp[i][j] += dp[i-1][j];
}
if(j) {
dp[i][j] += dp[i][j-1];
}
}
然后dir[8][2]
的定义下面定义好d[30][30]
数组
bool d[30][30];
然后用一个dp[i][j]
表示能走到位置(i, j)的方案数量,答案可能会很大,我们用 long long 类型来记录。初始化dp[0][0] = 1
,然后我们就可以进行递推了。这一步先定义好 dp 数组,然后先把递推的循环写好。
然后在main函数里面继续上一步for循环代码下面继续写下
dp[0][0] = 1;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
}
}
然后在bool d[30][30]
下面写下dp的定义
long long dp[30][30];
这时候我们通过递推公式来求解dp[i][j]的值。
dp[i][j] = dp[i−1][j] + dp[i][j−1]
需要注意边界条件,在边界上的位置只有一个方向,防止数组越界。那么我们可以通过把i和j分开来处理很方便的解决这个问题。注意还需要判断是否是马的覆盖点。
在上一步写的main函数的for循环里面修写下
d[cx][cy] = true;
for (int i = 0; i < 8; i++) {
int tx = cx + dir[i][0];
int ty = cy + dir[i][1];
if (tx >= 0 && tx <= n && ty >= 0 && ty <= m) {
d[tx][ty] = true;
}
}
最后,我们输出dp[n][m]
的值。
在main函数return 0之前写下
cout << dp[n][m] << endl;
这一节已经完成,点击 运行.
5 5 2 4
。