import java.util.Arrays; import java.util.Scanner; public class Main { static int N = 21; public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int x = in.nextInt(); int y = in.nextInt(); // 使用long,不然最后一个测试案例结果会溢出 long[][] dp = new long[N][N]; boolean[][] flag = new boolean[N][N]; // 处理了不能访问的点 flag[x][y] = true; for(int i = 0; i < N; i++) { for(int j = 0; j <N; j++) { if(i == x || j == y)continue; if(Math.abs(i-x)+Math.abs(j-y) == 3)flag[i][j]=true; } } // 处理第一行、第一列,在不能访问的点后面的点都是到达不了的 for(int j = 0; j <N; j++) { if(flag[0][j]) { break; } dp[0][j] = 1; } for(int i = 0; i <N; i++) { if(flag[i][0]) { break; } dp[i][0] = 1; } for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { // 累加前一步的方案数 if(!flag[i-1][j])dp[i][j] += dp[i-1][j]; if(!flag[i][j-1])dp[i][j] += dp[i][j-1]; } } System.out.println(dp[n][m]); } }
二维dp+判断能否到达