一、题目描述
二、算法分析说明与代码编写指导
设 f[m][n] 为卒从 (0,0)走到(m,n)的路径数。卒只能向右走或向下走,易得递推公式的第二种情形:
当某位置的正左方和正上方都为马可以跳到的点或是马本身,那么这点不可能被被卒走到,路径数为 0。我们将马所在位置和马可以跳到的八个点都标记为 -1。
这题有一个非常坑的地方:如果马可以跳至的点或者马本身在左边或上边,那么最上方一行的最右侧(最左方一列的最下侧)被标记为 -1 的点的右方(下方)也是卒不可以走到的,这些位置累计的路径数为 0。最上面一行和最左边一列的其余位置的路径数量都是 1,因为卒只能不断向右(下)走到达。如果把这些要标记 0 的地方标记为 1,只能对 1 组数据。
为了防止越界,将(m,n)和马的坐标(x,y)在处理前都加上 2。
三、AC 代码
#include<cstdio>
#pragma warning(disable:4996)
long long f[23][23], m, n, x, y;
inline long long a(const long long& x, const long long& y) {
static long long s, t;
if (f[x - 1][y] == -1)s = 0;
else s = f[x - 1][y];
if (f[x][y - 1]