假期学习
stl学习问题,函数多记忆难。看代码时总是想错,理解不清晰。
需要做题,加以熟练。
#include<stdio.h>
int main(){
int long long F[40][40]={0},s[40][40];
int x[9]={0,-2,-2,-1,-1,1,1,2,2};
int y[9]={0,1,-1,2,-2,2,-2,1,-1};
int Xm,Ym,Xb,Yb;
scanf("%d%d%d%d",&Xb,&Yb,&Xm,&Ym);
Xm+=2;Ym+=2;Xb+=2;Yb+=2;
F[2][2]=F[1][2]=1;
for(int i=0;i<=8;i++){
s[Xm+x[i]][Ym+y[i]]=1;
}
for(int i=2;i<=Xb;i++)
for(int j=2;j<=Yb;j++){
if(s[i][j])continue;
F[i][j]=F[i-1][j]+F[i][j-1];
}
printf("%lld",F[Xb][Yb]);
}
解题思路:
题目需要得出卒从出发点到目的地m的路线个数,且卒的移动方式只有前进和右移。这就意味着在移动过程中,棋子不会在同一个点出现两次。
当棋子移动到Ai
点时,棋上一步的所在位置只能是Ai
点的左边A1
和上面A2
。
所以可以得出棋子到达Ai
点的1路线数F(Ai
)=F(A1
)+F(A2
);
在输入马的坐标后,计算出其可以移动到达点,由于这些位置卒都不能到达,故到达这些点的路线数为0.
再通过两层for循环即可计算出答案.