【hrbust2293】棋盘村

2020-06-02 12:04:56 浏览数 (1)

题意

哈理工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]);
    }
}

0 人点赞