每一个点都有左边或者上边的点变化而来,所以递推式为: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; }