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;
}
相关推荐
CoderCodingNo15 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
晓晓hh16 小时前
JavaSE学习——迭代器
java·开发语言·学习
iFlyCai16 小时前
C语言中的指针
c语言·数据结构·算法
Laurence16 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
查古穆16 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来16 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能16 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背16 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
kyriewen1116 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code16 小时前
String.intern() 到底干了什么
java·开发语言·面试