solution:
#include<cstdio> using namespace std; long long f[40][40],flag[40][40]; int main() { int n,m,i,j,a,b; f[0][0]=1; scanf("%d%d%d%d",&n,&m,&a,&b); //标记马的控制点 if(a>=2&&b>=1) flag[a-2][b-1]=1; if(a>=2) flag[a-2][b+1]=1; if(a>=1&&b>=2) flag[a-1][b-2]=1; if(a>=1) flag[a-1][b+2]=1; if(b>=2) flag[a+1][b-2]=1; flag[a+1][b+2]=1; if(b>=1) flag[a+2][b-1]=1; flag[a+2][b+1]=1; flag[a][b]=1; for(i=1;i<=n;i++) { if(flag[i][0]==0) f[i][0]=f[i-1][0];//处理边界 else break;//如果(i,0)是马的控制点则到达此点的路线为0,且i+1到n之后点都无法到达 } for(i=1;i<=m;i++) { if(flag[0][i]==0) f[0][i]=f[0][i-1]; else break;//如果(0,i)是马的控制点则到达此点的路线为0,且i+1到n之后点都无法到达 } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(flag[i][j]==1) continue;//标记点 f[i][j]=f[i-1][j]+f[i][j-1];//到达上点与左点的路线之和 } } printf("%lld",f[n][m]); return 0; //不要省掉return 0 }