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+判断能否到达

京公网安备 11010502036488号