题意
哈理工2016级新生程序设计全国邀请赛A题 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2293 (0,0)走到(n,m)有多少种走法,每次向下或向右,其中(x,y)和(x,y)走日字能到的点不能走。 1<n,m<20
题解
递推,f[i][j]=f[i-1][j] f[i][j-1] 边界:f[0][0]=1。
代码
代码语言:javascript复制#include<cstdio>
#include<cstring>
int n,m,x,y;
long long f[25][25]={1};//注意开long long
bool no[25][25];
int dx[9]={-2,-2,-1,-1,1,1,2,2},
dy[9]={1,-1,2,-2,2,-2,1,-1};
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&m,&x,&y);
memset(no,0,sizeof no);
no[x][y]=1;
for(int i=0;i<8;i )
if(x dx[i]>=0&&y dy[i]>=0)//注意判断范围
no[x dx[i]][y dy[i]]=1;//代表不能走
for(int i=0;i<=n;i )
for(int j=0;j<=m;j )
if(!no[i][j]){//可行的点
if(i||j)//不能更新f[0][0],因为它是我们的边界值
f[i][j]=(i?f[i-1][j]:0) (j?f[i][j-1]:0);
}else
f[i][j]=0;
printf("%lldn",f[n][m]);
}
}