#include<iostream>
using namespace std;
const int s1[] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
const int s2[] = {0, 1 , 2, 2, 1, -1, -2, -2, -1}; //马可以走到的位置,上下对应
long long f[80][80],s[80][80];
int main()
{
long long i,b1,b2,m1,m2;
cin>>b1>>b2>>m1>>m2;
b1+=2,b2+=2,m1+=2,m2+=2; //整体移动,防止越界
f[2][1]=1; //初始化
s[m1][m2]=1; //马所在点 ,1 代表out
for(i=0;i<=8;i++)
{
s[m1+s1[i]][m2+s2[i]]=1; //马走日,这些是马可以吃卒的地方
}
for(int i = 2; i <= b1; i++)
{
for(int j = 2; j <= b2; j++)
{
if(s[i][j]) continue; // 如果被马拦住就直接跳过
f[i][j] = f[i-1][j] + f[i][j-1]; //状态转移方程
}
}
cout<<f[b1][b2];
return 0;
}
标签:洛谷,NOIP2002,int,P1002,long,m1,b1,m2,80
From: https://blog.csdn.net/shepherdSantiag/article/details/144159770