BFS入门刷题
目录
P1746 离开中山路
P1443 马的遍历
P1747 好奇怪的游戏
P2385 [USACO07FEB] Bronze Lilypad Pond B
P1746 离开中山路
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n;
int startx, starty;
int endx, endy;
char a[1010][1010];
int dis[1010][1010];
queue<pair<int, int>> q;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, -1, 0, 1};
int bfs(int x, int y)
{memset(dis, -1, sizeof dis);dis[x][y] = 0;q.push({x, y});while (!q.empty()){auto t = q.front();q.pop();for (int i = 0; i < 4; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= n && a[nx][ny] != '1' && dis[nx][ny] <= 0){q.push({nx, ny});dis[nx][ny] = dis[t.first][t.second] + 1;}}}return dis[endx][endy];
}
int main()
{cin >> n;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cin >> a[i][j];}}cin >> startx >> starty >> endx >> endy;cout << bfs(startx, starty);return 0;
}
P1443 马的遍历
2个样例TLE:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
int dis[410][410];
int n, m;
queue<pair<int, int>> q;
int startx, starty;
int bfs(int x, int y)
{if (x == startx && y == starty){return 0;}memset(dis, -1, sizeof dis);q.push({startx, starty});dis[startx][starty] = 0;while (!q.empty()){auto t = q.front();q.pop();for (int i = 0; i < 8; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && dis[nx][ny] <= 0){q.push({nx, ny});dis[nx][ny] = dis[t.first][t.second] + 1;}}}return dis[x][y];
}
int main()
{cin >> n >> m >> startx >> starty;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << bfs(i, j) << " ";}cout << endl;}return 0;
}
作者一开始想的是每个点都要计数,所以每个点都要搜一次,然后返回一个值
其实只要搜一次
用void类型,不用返回,从开始搜到结尾,然后每个点都会一层一层地搜到,最后dis数组里存的就是每个点的计数
优化:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
int dis[410][410];
int n, m;
queue<pair<int, int>> q;
int startx, starty;
void bfs(int x, int y)
{memset(dis, -1, sizeof dis);q.push({startx, starty});dis[startx][starty] = 0;while (!q.empty()){auto t = q.front();q.pop();for (int i = 0; i < 8; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && dis[nx][ny] <= 0){q.push({nx, ny});dis[nx][ny] = dis[t.first][t.second] + 1;}}}
}
int main()
{cin >> n >> m >> startx >> starty;bfs(startx, starty);dis[startx][starty] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << dis[i][j] << " ";}cout << endl;}return 0;
}
调用STL中的queue调用坐标需要花费比较长的时间,我们可以用数组来模拟queue节省时间
再优化:
#include <iostream>
#include <cstring>
using namespace std;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
int dis[410][410];
int n, m;
pair<int, int> q[410 * 410];
int startx, starty;
void bfs(int x, int y)
{memset(dis, -1, sizeof dis);int head = 0;int tail = 0;q[0] = {x, y};dis[x][y] = 0;while (head <= tail){auto t = q[head++];for (int i = 0; i < 8; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= n && ny <= m && dis[nx][ny] <= 0){q[++tail] = {nx, ny};dis[nx][ny] = dis[t.first][t.second] + 1;}}}
}
int main()
{cin >> n >> m >> startx >> starty;bfs(startx, starty);dis[startx][starty] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){cout << dis[i][j] << " ";}cout << endl;}return 0;
}
好像看不出什么区别
P1747 好奇怪的游戏
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int x1, y1;
int x2, y2;
int dis[30][30];
queue<pair<int, int>> q;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1, 2, 2, -2, -2};
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2, 2, -2, -2, 2};
int bfs(int x, int y)
{memset(dis, -1, sizeof dis);q.push({x, y});dis[x][y] = 0;while (!q.empty()){auto t = q.front();q.pop();for (int i = 0; i < 12; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= 20 && ny <= 20 && dis[nx][ny] <= 0){q.push({nx, ny});dis[nx][ny] = dis[t.first][t.second] + 1;}}}return dis[1][1];
}
int main()
{cin >> x1 >> y1 >> x2 >> y2;cout << bfs(x1, y1) << endl;cout << bfs(x2, y2) << endl;return 0;
}
P2385 [USACO07FEB] Bronze Lilypad Pond B
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<pair<int, int>> q;
int m, n;
int m1, n1;
int a[35][35];
int dis[35][35];
int startx, starty, endx, endy;
int bfs(int x, int y)
{memset(dis, -1, sizeof dis);q.push({x, y});dis[x][y] = 0;while (!q.empty()){auto t = q.front();q.pop();int dx[] = {m1, m1, -m1, -m1, n1, n1, -n1, -n1};int dy[] = {n1, -n1, n1, -n1, m1, -m1, m1, -m1};for (int i = 0; i < 8; i++){int nx = t.first + dx[i];int ny = t.second + dy[i];if (nx >= 1 && ny >= 1 && nx <= m && ny <= n && a[nx][ny] != 0 && a[nx][ny] != 2 && dis[nx][ny] == -1){dis[nx][ny] = dis[t.first][t.second] + 1;q.push({nx, ny});}}}return dis[endx][endy];
}
int main()
{cin >> m >> n >> m1 >> n1;for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){cin >> a[i][j];if (a[i][j] == 3){startx = i;starty = j;}if (a[i][j] == 4){endx = i;endy = j;}}}cout << bfs(startx, starty);return 0;
}
相关文章:

BFS入门刷题
目录 P1746 离开中山路 P1443 马的遍历 P1747 好奇怪的游戏 P2385 [USACO07FEB] Bronze Lilypad Pond B P1746 离开中山路 #include <iostream> #include <queue> #include <cstring> using namespace std; int n; int startx, starty; int endx, endy; …...

UE5 编辑器工具蓝图
文章目录 简述使用方法样例自动生成Actor,并根据模型的包围盒设置Actor的大小批量修改场景中Actor的属性,设置Actor的名字,设置Actor到指定的文件夹 简述 使用编辑器工具好处是可以在非运行时可以对资源或场景做一些操作,例如自动…...
手写multi-head Self-Attention,各个算子详细注释版
文章目录 MultiHeadAttentionFormal的实现操作详解1. 🔍 attention_mask2. 🔍 matmul✅ 其他实现方式1. 使用 运算符(推荐简洁写法)2. 使用 torch.einsum()(爱因斯坦求和约定)3. 使用 torch.bmm()…...
基于 Three.js 的文本粒子解体效果技术原理剖析
文章目录 一、整体架构与核心库引入二、Three.js 场景初始化三、文本粒子数据创建五、动画与交互实现在前端开发领域,通过代码实现炫酷的视觉效果总能给用户带来独特的体验。本文将深入剖析一段基于 Three.js 的代码,解读其实现文本粒子解体效果的技术原理。 实现效果: 一、…...
Vue组件定义
下面,我们来系统的梳理关于 Vue 组件定义 的基本知识点 一、组件化核心思想 组件(Component) 是 Vue 的核心功能,允许将 UI 拆分为独立可复用的代码单元。每个组件包含: 模板:声明式渲染结构逻辑:处理数据与行为样式:作用域 CSS(通过 <style scoped>)二、组件…...

数据仓库分层 4 层模型是什么?
企业每天都在产生和收集海量数据。然而,面对这些数据,许多企业却陷入了困境:如何高效管理、处理和分析这些数据?如何从数据中提取有价值的信息来支持业务决策?这些问题困扰着众多数据分析师和 IT 管理者。 在众多架构…...

基于亚博K210开发板——物体分类测试
开发板 亚博K210开发板 实验目的 本次测试主要学习 K210 如何物体分类,然后通过 LCD 显示屏实时显示当前物体的分类名称。本节采用百度出的 PaddlePaddle 平台开发。 实验元件 OV2640 摄像头/OV9655 摄像头/GC2145 摄像头、LCD 显示屏 硬件连接 K210 开发板…...
Kubernetes(K8s)核心架构解析与实用命令大全
在容器化技术席卷全球的今天,Kubernetes(简称K8s,以“8”代替“ubernete”八个字母)已成为云原生应用部署和管理的核心基础设施。作为Google基于内部Borg系统开源打造的容器编排引擎,K8s不仅解决了大规模容器管理的难题…...

什么是缺页中断(缺页中断详解)
文章目录 【操作系统】什么是缺页中断(缺页中断详解)一、缺页中断的本质与背景1. **虚拟内存与分页机制**2. **缺页中断的定义** 二、缺页中断的触发场景1. **首次访问新分配的虚拟页**2. **内存置换导致的页缺失**3. **访问权限冲突**4. **页表项无效**…...
解决:MySQL client, error code: 1251, SQLState: 08004
问题: Client does not support authentication protocol requested by server; consider upgrading MySQL client, error code: 1251, SQLState: 08004 原因: 客户端不支持服务器(8.0默认)caching_sha2_password 方式的链接认证…...

【echarts】仪表盘
<div style"width:50%;height:33%"><Yibiaopan echart_id"ybpChart2" :series_data"gaugeData2" title"火电" unit"MWh" :colorList"[#DFA58F,#F89061,#FF8E59]" /></div> 链接:ht…...

java27
1.IO流 FileOutPutStream字节输出流基本用法: 一次性写入一个字符串的内容: 注意:\r或者\n表示把普通的r或者n的字符转义成回车的意思,所以不需要\\ FileInputStream字节输入流基本用法 -1在ASCII码里面对应的符号: 不…...

OpenFeign和Gateway集成Sentinel实现服务降级
目录 OpenFeign集成Sentinel实现fallback服务降级cloud-alibaba-payment8003(支付服务)cloud-common-api(通用模块)cloud-alibaba-order9003(订单服务)Sentinel配置流控规则测试结果 Gateway集成Sentinel实现服务降级cloud-gateway9527(网关)测试结果 总结 OpenFeign集成Sentin…...
Gin项目脚手架与标配组件
文章目录 前言设计思想和原则✨ 技术栈视频实况教程sponge 内置了丰富的组件(按需使用)几个标配常用组件主要技术点另一个参考链接 前言 软件和汽车一样,由多个重要零部件组装而成。 本文堆积了一些常用部件,还没来得及好好整理。先放着。 神兵利器虽多…...
ros2总结-常用消息包类型以及查询消息包命令
ROS2官方提供了多个常用的消息包(message packages),这些消息包定义了标准的数据结构,用于机器人系统中的通信和数据交换。以下是ROS2官方常见的消息包及其用途: ### 1. **std_msgs** - **用途**:提供基…...
C#·常用快捷键
一、大小写转换 CTRL U转小写 CTRL SHIFT U转大写 二、调试快捷键 F6: 生成解决方案 CtrlF6: 生成当前项目 F7: 查看代码 ShiftF7: 查看窗体设计器 F5: 启动调试 CtrlF5: 开始执行(不调试) ShiftF5: 停止调试 CtrlShiftF5: 重启调试 F9: 切换断点 CtrlF9: 启用/停止断点 C…...
CSS3实现的账号密码输入框提示效果
以下是通过CSS3实现输入框提示效果的常用方法,包含浮动标签和动态提示两种经典实现方案: 一、浮动标签效果 <div class"input-group"><input type"text" required><label>用户名</label> </div><…...
沉浸式 VR 汽车之旅:汽车虚拟展厅与震撼试驾体验
在传统的汽车销售模式里,消费者的看车选车过程极为艰辛。他们常常需要花费大量的时间和精力,亲自前往一家又一家的 4S 店。有时候,为了对比不同品牌、不同型号的汽车,可能要穿梭于城市的各个角落,耗费一整天甚至数天的…...
低秩矩阵、奇异值矩阵和正交矩阵
低秩矩阵 低秩矩阵(Low-rank Matrix)是指秩(rank)远小于其行数和列数的矩阵,即 r a n k ( M ) r ≪ min ( m , n ) rank(M) r \ll \min(m,n) rank(M)r≪min(m,n)。其核心特点是信息冗余性,可通过少量…...

CS144 - LAB0
CS144 - Lab 0 telnet 发送请求 如图,很简单,但是注意输入时间太久会超时 发邮箱 首先我们需要用命令行去发邮箱,这里我用企业微信邮箱给自己的 qq 邮箱发送~ 整个命令如下! 对于其中的参数,其实从英文就可以看出来…...

论文浅尝 | 将复杂知识图谱问答对齐为约束代码生成(COLING2025)
笔记整理:康家溱,东南大学在读硕士,研究方向为代码大语言模型 论文链接:https://aclanthology.org/2025.coling-main.267.pdf 发表会议:COLING 2025 1. 动机 近年来,随着大语言模型(LLM…...
【Linux命令】scp远程拷贝
文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp(Secure Copy Protocol)是linux中基于ssh的安全文件传输工具,用于在本地和远程主机之前安…...

Golang|分布式搜索引擎中所使用到的设计模式
迭代器模式 定义:在遍历接口时,提供统一的方法函数供调用,保持一致性。核心思想:与大众习惯保持一致,方便第三方实现容器类时保持一致。常见方法:如next()方法,适用于所有集合类,简化…...

Ubuntu22.04通过命令行安装qt5
环境: VMware17Pro ubuntu-22.04.5-desktop-amd64.iso 步骤: 安装好虚拟机进入shell,或通过ssh登录,确保虚拟机能上外网,执行命令: sudo apt update sudo apt install build-essential sudo snap in…...
【仿生机器人】仿生机器人系统架构设计2.0——具备可执行性
结合我的需求后,来自Claude4.0 的结构设计 仿生机器人系统架构设计 一、系统总体架构 1.1 核心设计理念 涌现式情感:情感不是预设的规则,而是从环境感知、记忆关联和内在状态的复杂交互中涌现出来动态人格塑造:性格特质随着经…...

STM32:ESP8266 + MQTT 云端与报文全解析
知识点1【MQTT的概述】 1、概述 MQTT是一种基于发布/订阅模式的轻量级应用层协议,运行在TCP/IP协议之上,专用物联网(IoT)和机器对机器(M2M)设计,其核心目标是低带宽,高延迟或不稳定…...

HTML5 Canvas 星空战机游戏开发全解析
HTML5 Canvas 星空战机游戏开发全解析 一、游戏介绍 这是一款基于HTML5 Canvas开发的2D射击游戏,具有以下特色功能: 🚀 纯代码绘制的星空动态背景✈️ 三种不同特性的敌人类型🎮 键盘控制的玩家战机📊 完整的分数统…...

箱式不确定集
“箱式不确定集(Box Uncertainty Set)”可以被认为是一种 相对简单但实用的不确定集建模方式。 ✅ 一、什么是“简单的不确定集”? 在鲁棒优化领域,“简单不确定集”通常指的是: 特点描述形式直观数学表达简洁&#…...

内存管理 : 04段页结合的实际内存管理
一、课程核心主题引入 这一讲,我要给大家讲的是真正的内存管理,也就是段和页结合在一起的内存管理方式。之前提到过,我们先学习了分段管理内存的工作原理,知道操作系统采用分段的方式,让用户程序能以分段的结构进行编…...
不使用绑定的方法
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 初始设置 A 控件的宽度 ControlA.Width ControlB.Width / 2; // 监听 B 控件的 SizeChanged 事件 ControlB.SizeChanged (sender, e) > { ControlA.Width ControlB.Actual…...