题目链接
简单递推。 a[i][j]=a[i-1][j]+a[i][j-1];
当然,如果遇见马贼,或到马贼一步距离的位置 为0;
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=30;
int T,n,m,x,y;
int dir[8][2]={1,2,2,1,1,-2,2,-1,-1,-2,-2,-1,-1,2,-2,1};
ll a[maxn][maxn];
bool f[maxn][maxn];
void judge(int x1,int y1){
f[x1][y1]=0;
for(int i=0;i<8;i++)
f[x1+dir[i][0]][y1+dir[i][1]]=0;
}
int main()
{
scanf("%d",&T);
while(T--){
memset(f,true,sizeof(f));
memset(a,0,sizeof(a));
scanf("%d%d%d%d",&n,&m,&x,&y);
judge(x,y);
for(int i=1;i<=m;i++)
if(f[0][i])a[0][i]=1;
else break;
for(int i=1;i<=n;i++)
if(f[i][0])a[i][0]=1;
else break;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f[i][j]){
a[i][j]+=a[i-1][j]+a[i][j-1];
}else a[i][j]=0;
}
}
printf("%lld\n",a[n][m]);
}
return 0;
}