首先我们要知道内部一个点(不包括上边线和左边线)它是由它的上方和左方的那个点的总条数之和确定的,就像这样
现在我们知道了大致情况,类似于计算斐波那契数列。那马的控制点呢,该如何确定?题目中的样例可知马是走日字格的,也就是说我们需要规避掉这些点,还要判断这些点是否在棋盘上才能够规避。
创建一个数组负责对应到坐标上哪些点该走哪些点不该走,该走赋值为1不该走赋值为0(也就是马控制点赋值为0),再创建一个数组负责标示线总数。
内部点的运算法则,就是这样一个思路,现在来想外部点的运算,假如马控制点不在左边界或者上边界那么通过左边界或者上边界的条数一定为1,如果在的话那么该点之后的条数肯定为0
最后遍历数组,只计算qipan上为1的点,由于dp内部的点全都是初始化为0;那么如果碰到若由马的点计算的话,总条数就是0,递归遍历就是这样
C语言代码
#include<stdio.h>
int main() {
int q = 0; int w = 0; int e = 0; int r = 0;
scanf("%d%d%d%d", &q, &w, &e, &r);
int a[9] = { 0,-1,-1,-2,-2,1,1,2,2 };
int b[9] = { 0,2,-2,1,-1,2,-2,1,-1 };
long long qipan[21][21] = { 0 };
long long dp[21][21] = { 0 };a
for (int i = 0; i <= 20; i++) {
for (int j = 0; j <= 20; j++) {
qipan[i][j] = 1;
}
}
for (int n = 0; n <= 8; n++) {
int x = e + a[n]; int y = r + b[n]; if (x <= 20 && x >= 0 && y <= 20 && y >= 0) {
qipan[x][y] = 0;
}
}
for (int u1 = 0; u1 <=20; u1++) {
if (qipan[u1][0] == 1) dp[u1][0] = 1; else break;
}
for (int u2 = 0; u2 <= 20; u2++) {
if (qipan[0][u2] == 1)dp[0][u2] = 1; else break;
}
for (int k = 1; k <= 20; k++) {
for (int l = 1; l <= 20; l++) {
if (qipan[k][l] == 1) dp[k][l] = dp[k - 1][l] + dp[k][l - 1];
}
}printf("%lld", dp[q][w]);
return 0;
}