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

CCF-CSP 第 38 次认证第二题:机器人复健指南

针对 CCF-CSP 认证中的机器人移动问题,在 n×n 网格内从指定起点出发,计算 k 步跳跃范围内可抵达的方格总数。机器人每次可向八个特定方向移动,类似国际象棋中马的走法。通过深度优先搜索(DFS)或广度优先搜索(BFS)遍历所有可达状态,利用访问标记数组避免重复计数。由于 n 和 k 均不超过 100,直接模拟搜索即可高效得出结果。

樱花落尽发布于 2026/4/5更新于 2026/11/13110 浏览

题目背景

西西艾弗岛某山脉深处出土了一台远古机器人,具体年代已不可考。初步修缮后,研究人员尝试操控机器人进行些简单的移动。

题目描述

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

文章配图

若机器人只能跳动不超过 k 步,场地内有多少方格(包括起始位置)可以抵达?

输入格式

从标准输入读入数据。

输入的第一行包含空格分隔的两个正整数 n 和 k,分别表示场地大小和跳动步数。

输入的第二行包含空格分隔的两个正整数 x 和 y,表示机器人的起始位置(保证位于场地内)。

输出格式

输出到标准输出。

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

样例 1 输入

4 1 1 1 

样例 1 输出

3 

样例 2 输入

4 2 1 1 

样例 2 输出

8 

样例 2 解释

如下图所示,初始位置、第一步和第二步跳跃抵达的位置总计为 8。

文章配图

子任务

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

解题思路

这道题本质上是一个典型的图遍历问题。我们可以把每个方格看作图中的一个节点,合法的跳跃动作就是节点之间的边。因为需要统计 k 步内能到达的所有点,使用深度优先搜索(DFS)或者广度优先搜索(BFS)都很合适。

在实际编码时,我倾向于用 DFS,因为它实现起来比较直观。我们需要维护一个访问标记数组 st,防止重复访问同一个格子导致死循环或重复计数。全局变量 cnt 用来记录已经访问过的节点数量。

关于移动方向,题目图示暗示了这是一个马字形的跳法(类似国际象棋中的马),即横向走 1 格纵向走 2 格,或者横向 2 格纵向 1 格。这可以通过两个方向数组 dx 和 dy 来统一处理。

边界判断是这类题目的关键。每次递归前都要检查新坐标是否在 [1, n] 范围内,越界则跳过。另外要注意,步数 num 达到 k 时停止递归,但当前这一步所在的格子依然要计入总数。

代码实现

下面是完整的 C++ 实现,包含了必要的注释和格式化:

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

  N = ;
 n, k, x, y;
 st[N][N]; 
 cnt;       


 dx[] = {, , , , , , , };
 dy[] = {, , , , , , , };

{
    st[x][y] = ; 
    cnt++;           

     (num == k) ; 

     ( i = ; i < ; i++) {
         nx = x + dx[i];
         ny = y + dy[i];

        
         (nx <  || nx > n || ny <  || ny > n) ;

        
         (!st[nx][ny]) {
            (nx, ny, num + );
        }
    }
}

{
    cin >> n >> k >> x >> y;
    (x, y, );
    cout << cnt;
     ;
}
const
int
110
int
bool
// 访问标记数组
int
// 统计已访问节点的数量
// 定义 8 个跳跃方向(类似马走日)
int
8
1
2
1
2
-1
-2
-1
-2
int
8
2
1
-2
-1
2
1
-2
-1
void dfs(int x, int y, int num)
true
// 标记当前位置已访问
// 计数加一
if
return
// 步数用完,回溯
for
int
0
8
int
int
// 边界检查
if
1
1
continue
// 未访问过才继续搜索
if
dfs
1
int main()
dfs
0
return
0

这段代码逻辑清晰,时间复杂度主要取决于搜索的分支数和深度。考虑到 n, k ≤ 100,虽然理论上最坏情况可能较大,但在实际测试数据中通常能通过。如果担心超时,可以考虑 BFS 配合队列优化,不过对于本题的数据规模,DFS 已经足够。

目录

  1. 题目背景
  2. 题目描述
  3. 输入格式
  4. 输出格式
  5. 样例 1 输入
  6. 样例 1 输出
  7. 样例 2 输入
  8. 样例 2 输出
  9. 样例 2 解释
  10. 子任务
  11. 解题思路
  12. 代码实现

更多推荐文章

查看全部
  • 基于大模型 API 的健康饮食 Web 应用设计与实现
  • 适合 Python 新手的 5 个在线编程练习网站推荐
  • 大厂 HR 揭秘:为什么年底才是找工作的黄金期
  • CycleGAN 详解与图像风格转换实现
  • Windows 配置 NFS 客户端
  • System Verilog 硬件验证实战:从基础语法到高级应用
  • Git 常用指令速查
  • Lua 元表与元方法详解
  • YOLOv8 核心算法创新与工程部署详解
  • AutoGPT 结合 Python:构建自主 AI 智能体实战指南
  • 大模型落地观察:金融、医疗、制造、物流和农业的真实进展
  • Python import 导入机制详解
  • 前端 JS 加载失败处理方案与容灾策略
  • JDK 1.6 至 25 版本支持平台说明
  • 具身智能年度报告:RoboChallenge 4 万次真机评测显示最强模型成功率仅 51%
  • Stable Diffusion 小清新真人模型 V4.5 使用指南
  • Stable Diffusion ComfyUI 整合包安装与部署指南
  • Visual C++ 运行库安装方案与常见 DLL 缺失问题修复
  • Windows 环境下 Git 的安装与基础配置
  • 基于 FPGA 与 W5500 的 SPI 以太网通信实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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