本人蒟蒻,代码丑勿喷
这题嘛,组合数学里的杨辉三角来算路径,最基本的解法是DP,还有一种做法就是把格点换成01串找规律

******************************************************
#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{
char ch=getchar();int x=0,f=1;
while(ch>'9'||ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}//没用的快读
int ma_x,ma_y;
int n,m;
long long a[21][21];
void yhsj()
{
int max_=ma_x-2,may_=ma_y-2,max_a=ma_x+2,may_a=ma_y+2;
int i,j;
a[0][0]=1;
for(i=0;i<=n;++i)
for(j=0;j<=m;++j)
if(i==0||j==0)
{
if((i==ma_x&&j==ma_y)||(i==max_&&j==may_+1)||(i==max_&&j==may_a-1)||(i==max_a&&j==may_+1)||(i==max_a&&j==may_a-1)||(i==max_+1&&j==may_)||(i==max_a-1&&j==may_)||(i==max_+1&&j==may_a)||(i==max_a-1&&j==may_a))//把各个马可以走的点枚举
a[i][j]=0;
else
{
if(i>0)
a[i][0]+=a[i-1][0];//此处杨辉
if(j>0)
a[0][j]+=a[0][j-1];
}
}
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
if((i==ma_x&&j==ma_y)||(i==max_&&j==may_+1)||(i==max_&&j==may_a-1)||(i==max_a&&j==may_+1)||(i==max_a&&j==may_a-1)||(i==max_+1&&j==may_)||(i==max_a-1&&j==may_)||(i==max_+1&&j==may_a)||(i==max_a-1&&j==may_a))
a[i][j]=0;
else
{
a[i][j]=a[i-1][j]+a[i][j-1];
}
}
return ;
}
int main()
{
n=read(),m=read();
ma_x=read(),ma_y=read();
int i,j;
long long ans=0;
yhsj();
cout<<a[n][m];
return 0;
}
浙公网安备 33010602011771号