//洛谷1002过河卒
#include<bits/stdc++.h>
using namespace std;
long long xb,yb,xh,yh,f[30][30]={0},c[30][30]={0};//f数组表示卒到当前节点的路径条数,c数组表示卒是否能通过该点
int main()
{
cin >> xb >> yb >> xh >> yh;
xb+=2;yb+=2;//防止马跳到数组外越界 ,将整个有效区域向右下移动两个单位
xh+=2;yh+=2;
for(int i=2;i<30;i++)
{
f[2][i]=1;//第一列和第一行由于组只能下走和右走故只有一条线路
f[i][2]=1;
}
c[xh][yh]=1;
c[xh-2][yh+1]=1;//标记马的攻击区域 ,路线不能经过马
c[xh+2][yh+1]=1;
c[xh-2][yh-1]=1;
c[xh+2][yh-1]=1;
c[xh-1][yh+2]=1;
c[xh+1][yh+2]=1;
c[xh-1][yh-2]=1;
c[xh+1][yh-2]=1;
f[1][2] =1;//为第一次递归做铺垫,f[2][2]=f[1][2]+f[2][1],由于f[2][2]等于1],此时只将右侧一个元素变为1即可
for (int i=2;i<=xb;i++)
{
for(int j=2;j<=yb;j++)
{
if (c[i][j]==1)//马的位置
{
f[i][j] =0 ;continue;//路线不能经过马,所以马点的路径条数为零
}
f[i][j]=f[i-1][j]+f[i][j-1];//核心部分,通过递归从前往后获得所有位置的路径数,即f[i][j]的值
}
}
cout << f[xb][yb];
return 0;
}
洛谷1002过河卒
于 2024-07-25 17:16:50 首次发布