Description
Input
Output
Sample Input
6 6 3 3
Sample Output
6
这道题为递推问题,(n,m)处的总路径等于(n-1,m)与(n,m-1)的路径之和,以次类推。所以有基本递推公式f(n,m)=f(n-1,m)+f(n,m-1)。
基本思路为将马跳不到的地方初始化为1,将马的地方跟马调到的地方初始化为0,如果循环到的那个格不等于0,则f(n,m)=f(n-1,m)+f(n,m-1);如果等于0,就还保持原值0。所以f(n,m)即总路线。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[16][16];
int f(int n,int m);
int main()
{ int n,m,i,j,x,y;
cin>>n>>m>>x>>y;
for(i=0;i<=n;++i)
for(j=0;j<=m;++j)
a[i][j]=1;
a[0][0]=1;
a[x][y]=0;
a[x-2][y-1]=0;
a[x-2][y+1]=0;
a[x-1][y-2]=0;
a[x-1][y+2]=0;
a[x+1][y-2]=0;
a[x+1][y+2]=0;
a[x+2][y-1]=0;
a[x+2][y+1]=0;
for(i=0;i<=n;++i)
for(j=0;j<=m;++j)
if(a[i][j]!=0)
{ if(i==0&&j==0)continue;
if(i==0)a[i][j]=a[i][j-1];
else if(j==0)a[i][j]=a[i-1][j];
else a[i][j]=a[i-1][j]+a[i][j-1];
}
cout<<a[n][m]<<endl;
}
需要注意的是,当i=0或j=0时的越界问题,i=0或j=0时单独讨论即可。