思路:
首先是一个二维棋盘,最先定义的那么就是一个二维数组,然后可以把不能走到的点设置为-1,每次往下走的时候遇到-1就continue。
然后关于马的九个点是走不到的,这样我们就需要手动的将马的九个点设置为-1,但是要考虑一个问题,就是马的点很可能会越界,如何处理这个问题呢,我们在外层加2层即可,这样即使马在最外侧,仍然能够保持不越界。
代码:
#include<iostream>
using namespace std;
const int Mn = 10010;
long long a[Mn][Mn];
long long bx, by, mx, my;
int main()
{
cin >> bx >> by >> mx >> my;//输入b的坐标和马的坐标
//下一步设置好马和B的位置
bx += 2;
by += 2;
mx += 2;
my += 2;
//这个循环用来实现
a[2][2] = 1; //初始点设置为1
//马的九个点设置为1
a[mx][my] = -1;
a[mx + 1][my + 2] = -1;
a[mx + 1][my - 2] = -1;
a[mx - 1][my + 2] = -1;
a[mx - 1][my - 2] = -1;
a[mx + 2][my + 1] = -1;
a[mx + 2][my - 1] = -1;
a[mx - 2][my + 1] = -1;
a[mx - 2][my - 1] = -1;
//将外层都重置为1
for (int i = 0; i <= bx + 2; i++)
{
for (int j = 0; j <= by + 2; j++)
{
if (i == 0 || i == 1 || j == 0 || j == 1
|| i == bx + 1 || i == bx + 2 || j == by + 1 ||
j == by + 2)
a[i][j] = -1;
}
}
//这个循环用来计算路径数量,动态规划往后推
for (int i = 0; i <= bx + 2; i++)
{
for (int j = 0; j <= by + 2; j++)
{
if (a[i][j] < 0)continue;
if (a[i - 1][j] > 0)a[i][j] += a[i - 1][j];
if (a[i][j - 1] > 0)a[i][j] += a[i][j - 1];
}
}
//a[bx][by]为到达b点的最大路径数量
cout << a[bx][by];
return 0;
}