2 条题解

  • 1
    @ 2024-2-9 13:00:44
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #define ll long long
    using namespace std;
    
    const int fx[] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
    const int fy[] = {0, 1, 2, 2, 1, -1, -2, -2, -1};
    //马可以走到的位置
    
    int bx, by, mx, my;
    ll f[40][40];
    bool s[40][40]; //判断这个点有没有马拦住
    int main(){
        scanf("%d%d%d%d", &bx, &by, &mx, &my);
        bx += 2; by += 2; mx += 2; my += 2;
        //坐标+2以防越界
        f[2][1] = 1;//初始化
        s[mx][my] = 1;//标记马的位置
        for(int i = 1; i <= 8; i++) s[mx + fx[i]][my + fy[i]] = 1;
        for(int i = 2; i <= bx; i++){
            for(int j = 2; j <= by; j++){
                if(s[i][j]) continue; // 如果被马拦住就直接跳过
                f[i][j] = f[i - 1][j] + f[i][j - 1];
                //状态转移方程
            }
        }
        printf("%lld\n", f[bx][by]);
        return 0;
    } 
    
    • -7
      @ 2022-3-27 15:52:03

      老样子一道题一篇题解,不贴代码司空见惯 这一道题其实就是动态规划。卒的走法有限,得知了马的坐标就可以算出不能走的点,根据小学学的最短路径问题计算并判断是否经过不能走的点,如果是就清零 大致如此,不贴代码了。

      • 1

      信息

      ID
      3
      时间
      1000ms
      内存
      125MiB
      难度
      2
      标签
      递交数
      108
      已通过
      65
      上传者