注意马的拦截点逻辑判断,注意数组边界是end + 1。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] horse = new int[2], end = new int[2];
        end[0] = in.nextInt();
        end[1] = in.nextInt();
        horse[0] = in.nextInt();
        horse[1] = in.nextInt();
        long[][] dp = new long[end[0] + 1][end[1] + 1];
        dp[0][0] = 1;
        for (int i = 1; i <= end[1]; i++) {
            if (ifReach(0, i, horse)) {
                dp[0][i] = dp[0][i - 1];
            }
        }
        for (int r = 1; r <= end[0]; r++) {
            for (int c = 0; c <= end[1]; c++) {
                if (c == 0) {
                    if (ifReach(r, c, horse)) {
                        dp[r][c] = dp[r - 1][c];
                    }
                    continue;
                }
                if (ifReach(r, c, horse)) {
                    dp[r][c] = dp[r - 1][c] + dp[r][c - 1];
                }
            }
        }
        System.out.println(dp[end[0]][end[1]]);
    }

    public static boolean ifReach(int x, int y, int[] horse) {
        if (x == horse[0]) {
            return y != horse[1];
        }
        if (y == horse[1]) {
            return x != horse[0];
        }
        return Math.abs(x - horse[0]) + Math.abs(y - horse[1]) != 3;
    }
}