每一个点都有左边或者上边的点变化而来,所以递推式为:dp[i][j] = dp[i-1][j]+dp[i][j-1];。
再有就是如果是障碍点那么就需要直接将该点的方案数变成0,马走日的规律就是横坐标差1纵坐标差2或者横坐标差2纵坐标差1。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 22;
int dp[maxn][maxn];
signed main() {
int n, m, x, y;
cin>>n>>m>>x>>y;
n++;
m++;
x++;
y++;
dp[1][1] = 1;
//dp[i][j] = dp[i-1][j]+dp[i][j-1];
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
if (i==1&&j==1) continue;
if ((abs(x-i)==1&&abs(y-j)==2)||(abs(x-i)==2&&abs(y-j)==1)||(i==x&&y==j)) {
dp[i][j] = 0;
} else {
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
}
}
cout<<dp[n][m];
return 0;
}

京公网安备 11010502036488号