P1002 过河卒

本人蒟蒻,代码丑勿喷

这题嘛,组合数学里的杨辉三角来算路径,最基本的解法是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;
 
}