蒟蒻做这道题有一些简单的想法。

仔细思索了一下,感觉跟小学奥数的感觉很像
举个例子

可以这么解
作图,其中绿色为A,橘色为B,红色为断路C,每隔数字表示到达该位置的道路的条数(格子对应原图的格点)
到达图中(1,1)的路是到达(0,1)和(1,0)位置的总和,
(4,2)的左边因为是断路所以只可以由(4,1)一条路到达,可以将断路视为0

于是这道题的基本思路就有了
建立如上的一个棋盘,将马控制点全部扣去,再进行加法
为方便进行运算(toulan),我决定将棋盘向两个正方向分别挪一格
注意,题目提示表示至少要用long long。
我的代码如下

#include<bits/stdc++.h> //万能头文件

using namespace std;

int main()
{
    long long board[101][101], cn, cm, n, m; //其中cn和cm表示C的坐标
    memset(board, -1, sizeof(board)); //将整个棋盘赋值为-1,表示空地,可以落子
    cin >> n >> m >> cn >> cm;
    int t[8] = {1,-1,1,-1,2,-2,-2,2};
    int i = 0, j = 0;
    cn +=1; //因为将整个棋盘挪了一格,所以
    cm +=1;
    board[cn][cm] = 0; //马所在的点也是控制点
    for(i = 0; i <= 7; i++)
        board[cn+t[i]][cm+t[7-i]] = 0; //一个比较好的跳马问题快速解决办法
    for(i = 0; i <= n + 1; i++)
        board[i][0] = 0; //最下面和最左面两条不可以下子
    for(i = 0; i <= m + 1; i++)
        board[0][i] = 0;
    board[1][1] = 1; //为起点赋值,起点出发有且只有一种情况
    for(i = 1; i <= n + 1; i++)
        for(j = 1; j <= m + 1; j++)
        {
            if(board[i][j] == -1) //如果可以下子,则
                board[i][j] = board[i-1][j] + board[i][j-1];
        }
    cout << board[n+1][m+1];
    return 0;
}

希望大家可以给我的题解提提意见,谢谢!