跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

CCF-CSP 第 38 次认证真题解析:机器人移动范围计算

本题考察网格搜索算法,要求计算机器人在 n×n 网格中通过特定跳跃规则在 k 步内可达的方格总数。核心在于实现深度优先搜索,利用方向数组处理八种跳跃偏移,并通过访问标记数组避免重复计数。代码采用 C++ 编写,重点在于边界检查与递归终止条件的控制,确保在数据规模 n、k≤100 时高效运行。

蜜桃汽水发布于 2026/4/10更新于 2026/9/1076 浏览

题目背景

西西艾弗岛某山脉深处出土了一台远古机器人,初步修缮后研究人员尝试操控其进行简单移动。我们需要计算在特定规则下,机器人能抵达的方格数量。

题目描述

实验场地被划分为 n×n 个方格,坐标从 (1,1) 到 (n,n)。机器人只能在这些方格间移动,不能走出场地范围。假设机器人当前位于 (x,y),接下来可以向周围八个方向跳跃移动(如果目标方格在场地范围内)。

需要注意的是,根据代码实现逻辑,这里的'八个方向'实际上对应的是类似国际象棋中'马'的走法(即横向或纵向移动一格后再移动两格)。若机器人只能跳动不超过 k 步,场地内有多少方格(包括起始位置)可以抵达?

输入格式

从标准输入读入数据。

  • 第一行包含两个正整数 n 和 k,分别表示场地大小和跳动步数。
  • 第二行包含两个正整数 x 和 y,表示机器人的起始位置(保证位于场地内)。

输出格式

输出一个整数,表示 k 步内可以抵达的方格总数。

样例说明

样例 1 输入:4 1 1 1 输出:3

样例 2 输入:4 2 1 1 输出:8 解释:初始位置、第一步和第二步跳跃抵达的位置总计为 8。

子任务约束

  • 80% 的测试数据满足:k≤3;
  • 全部测试数据满足:n、k 均大于 0 且不超过 100。

解题思路

这是一个典型的网格搜索问题,可以使用 BFS 或 DFS 来解决。考虑到递归实现的简洁性,这里采用 DFS 方案。

在 DFS 实现中,步数作为递归函数的参数传递,每深入一层代表多跳一步。我们需要维护一个访问标记数组 st,防止重复访问同一个格子导致死循环或重复计数。全局变量 cnt 用于统计已访问节点的数量。

关键点在于方向数组的定义和边界判断。由于是跳跃移动,每次移动的偏移量是固定的,需要确保新坐标仍在 [1, n] 范围内。统计的节点数包括所有经过的位置,而不仅仅是终点。

代码实现

以下是基于 C++ 的完整实现,重点展示了方向数组的定义与递归终止条件。

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
int n, k, x, y;
bool st[N][N]; // 记录访问状态
int dx[8] = {1, 2, 1, 2, -1, -2, -1, -2};
int dy[8] = {2, 1, -2, -1, 2, 1, -2, -1};
int cnt; // 统计已访问节点数量

void dfs(int x, int y, int num) {
    st[x][y] = true;
    cnt++;
    if (num == k) return; // 步数用完,回溯

    for (int i = 0; i < 8; i++) {
        int a = x + dx[i], b = y + dy[i];
        // 边界检查
        if (a < 1 || a > n || b < 1 || b > n) continue;
        // 未访问过才继续搜索
        if (!st[a][b]) {
            dfs(a, b, num + 1);
        }
    }
}

int main() {
    cin >> n >> k >> x >> y;
    dfs(x, y, 0);
    cout << cnt;
    return 0;
}

在实际运行中,注意递归深度不会超过 k(最大 100),因此栈溢出风险极低。对于更大的数据规模,可能需要考虑 BFS 或记忆化搜索来优化性能。

目录

  1. 题目背景
  2. 题目描述
  3. 输入格式
  4. 输出格式
  5. 样例说明
  6. 子任务约束
  7. 解题思路
  8. 代码实现

更多推荐文章

查看全部
  • MacOS 快速部署 Open WebUI 的 Docker 方案
  • B 站 PC 端自动字幕脚本:快捷键控制与自动开启
  • FPGA 开发:Altera USB-Blaster 驱动安装与调试指南
  • VR-Reversal 实现 3D 视频转 2D 播放及录制教程
  • 前端面试核心考点解析:JavaScript 原理、Vue 机制与性能优化
  • 基于高阶控制障碍函数的端到端无人机高速避障强化学习框架
  • C++中string的常用函数用法总结
  • 生信零基础到独立项目:3 个月模块化学习计划
  • 无需公网 IP 安全访问本地 AI 服务的方案
  • 前端高频面试题:TypeScript 篇
  • Android 项目开发整体架构设计与演进
  • Win10 升级后 Copilot 弹窗烦人?彻底禁用与关闭方案
  • C++ 继承机制详解:语法、对象模型与虚拟继承
  • MySQL 表约束与数据完整性设计
  • FPGA Libero SoC 2024.2 安装与工程实战指南
  • DeepSeek-Coder-V2 开源发布:128K 上下文与多语言支持
  • 国内升级 GitHub Copilot 专业版的有效支付方案
  • OCC Architecture in DFT Design
  • GPU 云计算平台资源选型与大模型应用实践
  • 手机端运行 Stable Diffusion 的开源 AI 绘画工具

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online