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;
}
相关推荐
夜雪一千14 分钟前
Python 如何实现 SHA 加密?SHA1 / SHA256 / SHA512 实战教程
开发语言·python
王老师青少年编程23 分钟前
2021年CSP-J初赛真题及答案解析(完善程序2)
c++·真题·csp-j·答案·csp·初赛·信奥赛
有点。37 分钟前
C++二叉树(一)
开发语言·数据结构·c++
民乐团扒谱机44 分钟前
【微实验】谐波乘积谱(HPS)算法深度解析:原理、数学与代码实现
开发语言·人工智能·python·算法·语音识别·音乐
Nil2081 小时前
leetcode 73矩阵置0
算法·leetcode·矩阵
报错小能手1 小时前
Go 语言结构 基础语法
开发语言·后端·golang
Lazionr1 小时前
stack与queue:底层实现与容器适配器
开发语言·数据结构·c++
剩下了什么1 小时前
go语言 Ctx:「错误三:在 Context 中存储可变值」
开发语言·后端·golang
Hello_Damon_Nikola1 小时前
CH573从入门到精通
c语言·开发语言·单片机·嵌入式硬件
Logintern091 小时前
Langgraph使用MemorySaver建立有记忆的图
开发语言·windows·python