思考:
1.判断A(0,0)到达B(n,m)可以有两种情况:
A点的方向:(1)从B点上方来(2)从B点左边来
当n!=0&&m!=0时:F(i,j)=F(i-1,j)+F(i,j-1);
2.考虑边界问题:
i=0时,F(i,j)+=F(i,j-1),只能从左边来
j=0时,F(i,j)+=F(i-1,j),只能从上面来
3.用一个二维数组dir[8][2]表示马可以走的8个方向,第1列表示x的移动坐标,第2列表示y的移动坐标
4.对于马的坐标和马的控制点,我们需要用一个二维数组d[25][25]标记,用1标记为不可以通过,0表示可以通过;在全局变量中定义二维数其各元素值为0;
#include<iostream>
using namespace std;
int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
//用来记录马走日的8个点坐标
int d[25][25];//用来记录是否是马的控制点
long long dp[25][25];//用来记录有多少种方案
int cx,cy,n,m;
int main(){
cin>>n>>m>>cx>>cy;
d[cx][cy]=1;
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
int tx=cx+dir[i][0];
int ty=cy+dir[i][1];
if(tx>=0&&tx<=n&&ty>=0&&ty<=m){
d[tx][ty]=1;
}
}
}
dp[0][0]=1;
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(d[i][j]==0){
/*if(i){
dp[i][j]+=dp[i-1][j];
}
if(j){
dp[i][j]+=dp[i][j-1];
}*/
if(i==0){
dp[i][j]+=dp[i][j-1];
}
if(j==0){
dp[i][j]+=dp[i-1][j];
}
if(i!=0&&j!=0){
dp[i][j]+=dp[i][j-1]+dp[i-1][j];
}
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}