#include <stdio.h>
#include <string.h>
#define inbound(x,y) ((x <= row && x >= 0) && (y <= row && y >= 0))
#define abs(val) (val & (1 << 31) ? -val : val)
using namespace std;
int main(){
volatile long long int dp [31][31];
memset((void *)dp, 0, sizeof(dp));
int row,col,mx,my;
scanf("%d %d %d %d",&row,&col, &mx, &my);
int m[]{-2,-1,1,2}, x, y;
for(int i = 0;i < 4;i++){
x = mx + m[i];
y = my + 3 - abs(m[i]);
if(inbound(x,y)){
dp[x][y] = -1;
}
y = my - 3 + abs(m[i]);
if(inbound(x,y)){
dp[x][y] = -1;
}
}
dp[0][0] = 1;
dp[mx][my] = -1;
for(int i = 0;i <= row;i++){
for(int j = 0;j <= col;j++){
if((i || j) && dp[i][j] != -1){
if(inbound(i - 1,j) && dp[i - 1][j] > 0) dp[i][j] += dp[i - 1][j];
if(inbound(i,j - 1) && dp[i][j - 1] > 0) dp[i][j] += dp[i][j - 1];
}
}
}
printf("%lld\n",dp[row][col] == -1 ?0 : dp[row][col]);
}
这是我提交的代码。完全没有思路那里可能有错,求诸位救一下。(还有5的测试点是什么啊)