过河卒
解题思路
- lan[][]:马会走到的地方
- f[i][j]:能到达i,j点的路数
- 能到达点(i,j)的条数=能到达(i-1,j)的条数+能到达(i,j-1)的条数
- 这题难点在于如何初始化f[][]数组? 因为马一下跳两格,所以要将数组往右下移两格。可以这样想:数出到某一点有几条路,然后往前推出要初始化的点。
解题代码
#include<bits/stdc++.h>
using namespace std;
const int N=30;
#define ll long long
int main(){
int n,m,x,y;
cin>>n>>m>>x>>y;
n+=2;m+=2;x+=2;y+=2;
int dir[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
bool lan[N][N]={0};//马会走到的地方
ll f[N][N]={0};//注意数据会变得很大,所以开ll
lan[x][y]=1;
for(int i=0;i<8;i++) lan[x+dir[i][0]][y+dir[i][1]]=1;
f[2][1]=1;//初始化
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(lan[i][j]) continue;
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
cout<<f[n][m]<<endl;
return 0;
}