#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