过河卒
洛谷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; }