典型的递推题。。为了避免越界,把矩阵往右下移一下,我们知道一个点的走法数是它上面的点与左边的点的走法数之和(在最短路径情况下),剩下的毋须多言,要开long long!!
放代码
#include<bits/stdc++.h>
using namespace std;
long long jz[50][50],n,m,x,y;
int main()
{
cin>>n>>m>>x>>y;
n++;
m++;
x++;
y++;//避免越界
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
jz[i][j]=-1;//标记为-1,其实0好像也行,不过得改代码
}
}
if(x+2>=1&&y+1>=1)
jz[x+2][y+1]=0;
if(x+2>=1&&y-1>=1)
jz[x+2][y-1]=0;
if(x+1>=1&&y-2>=1)
jz[x+1][y-2]=0;
if(x+1>=1&&y+2>=1)
jz[x+1][y+2]=0;
if(x-1>=1&&y+2>=1)
jz[x-1][y+2]=0;
if(x-1>=1&&y-2>=1)
jz[x-1][y-2]=0;
if(x-2>=1&&y+1>=1)
jz[x-2][y+1]=0;
if(x-2>=1&&y-1>=1)
jz[x-2][y-1]=0;
jz[x][y]=0;//到这为止,暴力枚点
int pdd=1;//顶行处理
for(int i=1;i<=n;i++)
{
if(jz[i][1]!=0&&pdd==1)
jz[i][1]=1;
else
{
pdd=0;
jz[i][1]=0;
}
}
pdd=1;//顶列处理
for(int i=1;i<=m;i++)
{
if(jz[1][i]!=0&&pdd==1)
{
jz[1][i]=1;
}
else
{
pdd=0;
jz[1][i]=0;//碰到马占的点就把后面的点标记为0
}
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=m;j++)
{
if(jz[i][j]==0)
{
continue;
}
else
{
jz[i][j]=jz[i-1][j]+jz[i][j-1];//老生常谈
}
}
}
cout<<jz[n][m];
}