马拦过河卒

首先我们要知道内部一个点(不包括上边线和左边线)它是由它的上方和左方的那个点的总条数之和确定的,就像这样

现在我们知道了大致情况,类似于计算斐波那契数列。那马的控制点呢,该如何确定?题目中的样例可知马是走日字格的,也就是说我们需要规避掉这些点,还要判断这些点是否在棋盘上才能够规避。

创建一个数组负责对应到坐标上哪些点该走哪些点不该走,该走赋值为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值