题目

攻克点
- 计算路线条数的方法
- 定义马可在地方的方法
原理
计算路线条数的方法
- 先考虑如果没有任何马的限制,卒子可以随便向右向下走
- 那么可以想到,一个卒子只能从 当前格子的左侧格子 和 当前格子的上方格子 上走到当前格子
- 那么假设从 (1,1)走到 当前格子的左侧格子 的路径条数是x,从 (1,1)走到 当前格子的上方格子 的路径条数是 y
- 那么从 (1,1) 走到当前格子的路径条数就应该是 x+y
定义马可在地方的方法
- 定义数组,然后将马的横纵坐标分别减去坐标里面的数字
实现
- 定义初始位置为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};定义所需要的变量,并输入
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; // 初始化马的位置定义布尔型数组,用来存储马能行动的地方,且定义为1,方便后面去除
s[mx][my] = 1; // 标记马的位置 for (int i = 1; i <= 8; i++) s[mx + fx[i]][my + fy[i]] = 1;用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]; // 防止访问负数索引 } }打印终点格子的值
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;
}
5 条评论
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/8st4cLVnTF.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/LLfP3qahFY.html
你的文章让我感受到了不一样的视角,非常精彩。 https://www.yonboz.com/video/3588.html
你的文章让我学到了很多技能,非常实用。 http://www.55baobei.com/WjTvqN5TWZ.html
博主太厉害了!