注:在矩形棋盘里求路径方案,最高可能是N的阶乘级别的,我们一定开long long 记住
动态规划分析
step1:定义状态表示 f[i][j]表示从起点到i,j的路径条数
step2:推导状态转移方程
如果是马的范围,就为0
其余范围
step3:初始化 让f[0][1]为1
step4 填表顺序,从上到下,从左到右
step5:答案存储在f[n][m]里
这里我们判断马的攻击范围是很重要的,我们可以利用好哈曼顿距离,因为我们发现只要不是在马的列或者行上的距离马哈曼顿距离为3的点都是攻击的点
哈曼吨距离就是abs(x1-x2)+abs(y1-y2)
好了,我们可以写代码了
#include <iostream>
#include <cstdlib>
using namespace std;
const int N = 30;
typedef long long ll;
ll f[N][N];
ll n,m,x,y;
int main()
{
cin >> n >> m >> x >> y;
n++,m++,x++,y++;
f[1][0] = 1;
for(ll i = 1;i<=n;i++)
{
for(ll j = 1;j<=m;j++)
{
if(i!=x&&j!=y && (abs(x-i)+abs(y-j))==3)continue;
if(i==x && j==y) continue;
f[i][j] = f[i-1][j]+f[i][j-1];
}
}
cout << f[n][m];
return 0;
}