我的思路:
这道题可以先定义数组,模拟马的行走状态,然后从第一个点开始搜索,判断如果马能跳到当前过河卒的位置就进行下一次搜索,如果不能,就把上面的点和左面的点的路径数累加,最后输出最后一个点。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int dx[10]={0,-2,-1,1,2,2,1,-1,-2};
int dy[10]={0,1,2,2,1,-1,-2,-2,-1};
//马可以跳到的位置的坐标
int bx,by,mx,my;
bool vis[25][25]; //标记
long long ans[25][25]; //路径条数
int main(){
cin>>bx>>by>>mx>>my;
bx+=2;
by+=2;
mx+=2;
my+=2;
ans[2][1]=1; //从第一个点开始搜索
vis[mx][my]=1; //第一个点有1种方法
for(int i=1;i<=8;i++)//所有马能跳到的地方进行标记
vis[mx+dx[i]][my+dy[i]]=1;
for(int i=2;i<=bx;i++){
for(int j=2;j<=by;j++){
if(vis[i][j]) //判断是否被马拦住
continue;
ans[i][j]=ans[i-1][j]+ans[i][j-1];
//任意一个点的路径条数等于上面的点加左面的点
//f[i][j]=f[i-1][j]+f[i][j-1];
}
}
cout<<ans[bx][by]<<endl; //路径总数
// 也就是最后一个点(n, m)
return 0;
}