过河卒

洛谷1002 过河卒

在满足能走的条件下,f[i][j]表示从左上角走到(i,j)的方案数,方程为f[i][j]=f[i-1][j]+f[i][j-1].

#include<bits/stdc++.h>
using namespace std;

long long f[30][30];
int x[]={-2,-2,-1,-1,1,1,2,2};
int y[]={-1,1,-2,2,-2,2,-1,1};
int n,m,X,Y;
int main()
{
  cin>>n>>m;
  cin>>X>>Y;
  f[X][Y]=-1;
  for(int i=0;i<8;i++)
      if(X+x[i]>=0&&Y+y[i]>=0)
       f[X+x[i]][Y+y[i]]=-1;
       f[0][0]=1;
  for(int i=0;i<=n;i++)
    for(int j=0;j<=m;j++)
      {
          if(f[i][j]!=-1)
          {
              if(f[i][j-1]>=0&&j-1>=0&&i-1>=0&&f[i-1][j]>=0)
              f[i][j]+=f[i][j-1]+f[i-1][j];
            else
              if((f[i][j-1]<0||j-1<0)&&i-1>=0&&f[i-1][j]>=0)
                f[i][j]=f[i-1][j];
            else
               if(f[i][j-1]>=0&&j-1>=0&&(i-1<0||f[i-1][j]<0))
                f[i][j]=f[i][j-1];
        }
      }
    cout<<f[n][m];    
  return 0;
}
原文地址:https://www.cnblogs.com/war1111/p/7374318.html