#include <bits/stdc++.h>
using namespace std;
int mp[30][30];
long long dp[30][30];//细节!!!(用int会爆)
int xb, yb, xc, yc;
int main()
{
cin>>xb>>yb>>xc>>yc;
xb+=2, yb+=2, xc+=2, yc+=2;//边界问题,扩大疆域
//马的占据点标记
mp[xc][yc]=-1;mp[xc-2][yc-1]=-1;mp[xc-2][yc+1]=-1;mp[xc-1][yc-2]=-1;mp[xc-1][yc+2]=-1;
mp[xc+1][yc-2]=-1;mp[xc+1][yc+2]=-1;mp[xc+2][yc-1]=-1;mp[xc+2][yc+1]=-1;
/* 初始化细节!!
如果在标记马的位置先初始化,那么如果马可以跳到边界,本应该是dp=0,但这样操作仍然赋值为了1
如果边界有个为0了,后面的dp都为0了
*/
if(mp[2][2]==-1){
cout<<0<<endl;
return 0;
}
for(int i=2;i<=25;i++){
if(mp[i][2]==-1)break;
dp[i][2]=1;
}
for(int i=2;i<=25;i++){
if(mp[2][i]==-1)break;
dp[2][i]=1;
}
for(int i=3;i<=xb;i++)
{
for(int j=3;j<=yb;j++)
{
if(mp[i][j]==-1){
dp[i][j]=0;
continue;
}
dp[i][j]=dp[i-1][j]+dp[i][j-1];//状态转移方程!!!
}
}
cout<<dp[xb][yb]<<endl;
return 0;
}
洛谷P1002 [NOIP2002 普及组] 过河卒(动态规划)
于 2023-10-30 12:17:05 首次发布