描述
A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如下图 C 点可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 棋盘用坐标表示,现给定A 点位置为(0,0)B 点位置为(n,m)(n,m 为不超过 20 的整数),马的位置为C(X,Y)(约定: C点与A点不重叠,与B点也不重叠)。要求你计算出卒从 A 点能够到达 B 点的路径的条数。
输入
B点的坐标(n,m)以及对方马的坐标(X,Y)(马的坐标一定在棋盘范围内,但要注意,可能落在边界的轴上)
输出
输出卒从 A 点能够到达 B 点的路径的条数
输入样例 1
6 6 3 2输出样例 1
17
#include<bits/stdc++.h>
using namespace std;
int f[55][55];
int i,j,x,y;
long long dp[55][55];
int c[8][2] = {{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2}};
int main()
{
long long int a,b,n,m;
cin>>a>>b>>n>>m;
f[n][m]=1;
for(i=0;i<8;i++){
x=n+c[i][0];
y=m+c[i][1];
if(x>=0&&x<=a&&y>=0&&y<=b)
f[x][y]=1;
}
dp[0][0]=1;
for(i=0;i<=a;i++)
{
for(j=0;j<=b;j++)
{
if((i==0&&j==0)||f[i][j]==1)
continue;
else if(i==0)
dp[i][j]=dp[i][j-1];
else if(j==0)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
cout<<dp[a][b];
return 0;
}