CCF-CSP 38-2 机器人复健指南(jump)【C++】考点:BFS/DFS

题目

TUOJhttps://sim.csp.thusaac.com/contest/38/problem/1

思路

会bfs/dfs就可以拿满

代码

可以让AI总结一下代码逻辑

(本题可以类比成我们熟悉的场景,比如"马"在棋盘上走)

这是一个使用**广度优先搜索(BFS)**计算马在棋盘上指定步数内能到达多少不同格子的程序。

一、问题设定

有一个大小为 n×n 的棋盘,棋盘坐标从 1 到 n。给定马的起点位置 (x, y) 和一个最大步数 k,要求计算马在不超过 k 步的情况下,一共能到达多少个不同的格子(包括起点)。

二、核心思路

  • 马有 8 个可能的移动方向(走"日"字)

  • 使用 BFS 逐层搜索,保证第一次到达某个格子时用的步数最少

  • 用一个二维数组 vis 记录格子是否已经被访问过,避免重复计数

三、执行流程

  1. 读入棋盘大小 n、最大步数 k 和起点坐标 (x, y)

  2. 初始化答案为 1(起点本身算一个格子)

  3. 将起点加入队列,标记为已访问

  4. 不断从队列取出位置:

    • 如果当前步数已经达到 k,就不再从该位置继续扩展

    • 否则尝试 8 个方向移动

    • 如果新位置在棋盘内且未被访问,则标记访问、入队、答案加一

  5. 队列为空后,输出答案

四、关键点

  • BFS 保证了每个格子第一次被访问时步数最小

  • 用 vis 数组保证每个格子只计数一次

  • 步数达到 k 时停止扩展,但之前入队的同层节点仍会继续处理

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n' 
int vis[105][105];
int dx[]={-2,-1,1,2,2,1,-1,-2};
int dy[]={1,2,2,1,-1,-2,-2,-1};

struct node{
	int x,y,step;
};

void solve()
{
	int n,k,x,y; cin>>n>>k>>x>>y;
	int ans=1; //warn:出发点算一个
	vis[x][y]=1;
	queue<node>q;
	q.push({x,y,0});
	while(!q.empty()) {
		auto t=q.front(); q.pop();
		int step=t.step;
		if(step==k) continue;
		for(int i=0;i<8;i++){
			int nx=t.x+dx[i];
			int ny=t.y+dy[i];
			if(vis[nx][ny]) continue;
			if(nx<1||nx>n||ny<1||ny>n) continue;
			vis[nx][ny]=1;
			q.push({nx,ny,step+1});
			ans++;
		}
	}
	cout<<ans<<endl;
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0);
	solve(); 
	return 0;
}
相关推荐
唐墨1232 小时前
linux kernel 比较数据大小的宏定义
linux·算法
爱笑的k112 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
拂拉氏2 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
X1A0RAN3 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
熊猫钓鱼>_>4 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮4 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克6056 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
布莱克6056 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
通信小呆呆7 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
老歌老听老掉牙7 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso