题目

攻克点

  1. 计算路线条数的方法
  2. 定义马可在地方的方法

原理

计算路线条数的方法

  • 先考虑如果没有任何马的限制,卒子可以随便向右向下走
  • 那么可以想到,一个卒子只能从 当前格子的左侧格子 和 当前格子的上方格子 上走到当前格子
  • 那么假设从 (1,1)走到 当前格子的左侧格子 的路径条数是x,从 (1,1)走到 当前格子的上方格子 的路径条数是 y
  • 那么从 (1,1) 走到当前格子的路径条数就应该是 x+y

定义马可在地方的方法

  • 定义数组,然后将马的横纵坐标分别减去坐标里面的数字

实现

  • 定义初始位置为1,向右或向右移动时,数字为左边和上面的数字之和,最后终点的数字即为路线条数

  • 绿色为马能阻拦的地方,遇到这种地方时跳过,且不计数

代码分析

  1. 定义马可以行动的横纵坐标,用数组一一对应

    const int fx[] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
    const int fy[] = {0, 1, 2, 2, 1, -1, -2, -2, -1};
  2. 定义所需要的变量,并输入

    long long f[40][40];//定义棋盘
    int bx, by, mx, my;
    scanf("%d%d%d%d", &bx, &by, &mx, &my);
    f[0][0] = 1;   // 初始化卒的位置
    s[mx][my] = 1; // 初始化马的位置
  3. 定义布尔型数组,用来存储马能行动的地方,且定义为1,方便后面去除

    s[mx][my] = 1; // 标记马的位置
        for (int i = 1; i <= 8; i++)
            s[mx + fx[i]][my + fy[i]] = 1;
  4. 用for循环遍历x轴,并嵌套循环y轴,遇到马能抵达的地方时跳过

    for (int i = 0; i <= bx; i++)
        {
            for (int j = 0; j <= by; j++)
            {
                if (s[i][j] == 1)//根据步骤3中的定义,如果马能到达,则其值为1
                    continue; // 如果被马能到达时就跳过,到下一个格子
                if (i > 0)
                    f[i][j] += f[i - 1][j]; // 防止访问负数索引
                if (j > 0)
                    f[i][j] += f[i][j - 1]; // 防止访问负数索引
            }
        }
  5. 打印终点格子的值

    printf("%lld\n", f[bx][by]);

完整代码

#include <iostream>
int main()
{
    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;
    long long f[40][40];
    bool s[40][40];

    scanf("%d%d%d%d", &bx, &by, &mx, &my);

    f[0][0] = 1;
    s[mx][my] = 1;

    for (int i = 1; i <= 8; i++)
        s[mx + fx[i]][my + fy[i]] = 1;

    for (int i = 0; i <= bx; i++)
    {
        for (int j = 0; j <= by; j++)
        {
            if (s[i][j] == 1)
                continue;

            if (i > 0)
                f[i][j] += f[i - 1][j];
            if (j > 0)
                f[i][j] += f[i][j - 1];
        }
    }

    printf("%lld\n", f[bx][by]);

    return 0;
}
最后修改:2025 年 07 月 18 日
如果觉得我的文章对你有用,请随意赞赏