每一个点都有左边或者上边的点变化而来,所以递推式为:dp[i][j] = dp[i-1][j]+dp[i][j-1];。
再有就是如果是障碍点那么就需要直接将该点的方案数变成0,马走日的规律就是横坐标差1纵坐标差2或者横坐标差2纵坐标差1。
#include <bits/stdc++.h>

using namespace std;
#define int long long
const int maxn = 22;
int dp[maxn][maxn];

signed main() {
    int n, m, x, y;
    cin>>n>>m>>x>>y;
    n++;
    m++;
    x++;
    y++;
    dp[1][1] = 1;
    //dp[i][j] = dp[i-1][j]+dp[i][j-1];
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            if (i==1&&j==1) continue;
            if ((abs(x-i)==1&&abs(y-j)==2)||(abs(x-i)==2&&abs(y-j)==1)||(i==x&&y==j)) {
                dp[i][j] = 0;
            } else {
                dp[i][j] = dp[i-1][j]+dp[i][j-1];
            }
        }
    }
    cout<<dp[n][m];
    return 0;
}