NOIP2013提高组.华容道
题目
509. 华容道

算法标签: 搜索, b f s bfs bfs, s p f a spfa spfa
思路
不难发现, 在人移动的过程中, 箱子是不动的, 从当前位置到下一个箱子旁边的位置不会移动箱子, 可以预处理出人在每个位置到其他位置的距离预处理, 从某一个状态出发, 走到另一个状态的最短路使用 s p f a spfa spfa算法, 一般来说时间复杂度 O ( m ) O(m) O(m), 极端情况下时间复杂度 O ( n m ) O(nm) O(nm)
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;
const int N = 35, M = 3610, K = M * 4, INF = 0x3f3f3f3f;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int n, m, q, g[N][N];
vector<PII> head[M];
int d1[N][N], d2[M];
bool vis[M];void add(int u, int v, int w) {head[u].push_back({v, w});
}int get(int x, int y, int z) {return ((x - 1) * m + y - 1) * 4 + z;
}void bfs(int px, int py, int bx, int by, int dir) {queue<PII> q;memset(d1, 0x3f, sizeof d1);d1[px][py] = d1[bx][by] = 0;q.push({px, py});while (!q.empty()) {auto [x, y] = q.front();q.pop();for (int i = 0; i < 4; ++i) {int nx = x + dx[i], ny = y + dy[i];if (g[x][y] && d1[x][y] + 1 < d1[nx][ny]) {d1[nx][ny] = d1[x][y] + 1;q.push({nx, ny});}}}if (dir == -1) return;int u = get(bx, by, dir);for (int i = 0; i < 4; ++i) {if (i == dir) continue;int nx = bx + dx[i], ny = by + dy[i];if (d1[nx][ny] < INF) {add(u, get(bx, by, i), d1[nx][ny]);}}// 搬运到对立面的箱需要1的花费add(u, get(px, py, dir ^ 2), 1);
}int spfa(int sx, int sy, int tx, int ty) {queue<int> q;memset(d2, 0x3f, sizeof d2);for (int i = 0; i < 4; ++i) {int nx = sx + dx[i], ny = sy + dy[i];if (d1[nx][ny] < INF) {int u = get(sx, sy, i);d2[u] = d1[nx][ny];q.push(u);vis[u] = true;}}while (!q.empty()) {auto u = q.front();q.pop();vis[u] = false;for (auto [v, w] : head[u]) {if (d2[u] + w < d2[v]) {d2[v] = d2[u] + w;if (!vis[v]) {q.push(v);vis[v] = true;}}}}int ans = INF;for (int i = 0; i < 4; ++i) {ans = min(ans, d2[get(tx, ty, i)]);}if (ans == INF) ans = -1;return ans;
}int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m >> q;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {cin >> g[i][j];}}for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (g[i][j]) {// 枚举人的位置for (int k = 0; k < 4; ++k) {int nx = i + dx[k], ny = j + dy[k];if (g[nx][ny]) bfs(nx, ny, i, j, k);}}}}while (q--) {int ex, ey, sx, sy, tx, ty;cin >> ex >> ey >> sx >> sy >> tx >> ty;if (sx == tx && sy == ty) cout << 0 << "\n";else {// 现将人移动到箱子周围bfs(ex, ey, sx, sy, -1);// 再从箱子周围的状态转移到最终状态int ans = spfa(sx, sy, tx, ty);cout << ans << "\n";}}return 0;
}
相关文章:
NOIP2013提高组.华容道
题目 509. 华容道 算法标签: 搜索, b f s bfs bfs, s p f a spfa spfa 思路 不难发现, 在人移动的过程中, 箱子是不动的, 从当前位置到下一个箱子旁边的位置不会移动箱子, 可以预处理出人在每个位置到其他位置的距离预处理, 从某一个状态出发, 走到另一个状态的最短路使…...
政安晨【超级AI工作流】—— 基于COZE探索有趣的主题互动问答工作流(同宇宙儿童提问机)
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本例,我们将从零展示如何创建一款专门针对儿童对某项主题进行问答的对话流智能体…...
Derivatives and Differentiation (导数和微分)
Derivatives and Differentiation {导数和微分} 1. Derivatives and Differentiation (导数和微分)1.1. Visualization Utilities 2. Chain Rule (链式法则)3. DiscussionReferences For a long time, how to calculate the area of a circle remained a mystery. Then, in Anc…...
P17_ResNeXt-50
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、模型结构 ResNeXt-50由多个残差块(Residual Block)组成,每个残差块包含三个卷积层。以下是模型的主要结构࿱…...
Ubuntu上离线安装ELK(Elasticsearch、Logstash、Kibana)
在 Ubuntu 上离线安装 ELK(Elasticsearch、Logstash、Kibana)的完整步骤如下: 一.安装验证 二.安装步骤 1. 在联网机器上准备离线包 (1) 安装依赖工具 #联网机器 sudo apt update sudo apt install apt-rdepends wget(2) 下载 ELK 的 .deb 安装包 #创建目录将安装包下载…...
PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境
PyCharm 是一款专为 Python 开发设计的集成开发环境(IDE),它提供了强大的代码编辑、调试、版本控制等功能,是 Python 开发者的必备工具之一。如果你是初学者,或者正在寻找一款高效的开发工具,这篇文章将帮助…...
TSMaster在新能源汽车研发测试中的硬核应用指南
——从仿真到标定,全面赋能智能汽车开发 引言:新能源汽车测试的挑战与TSMaster的破局之道 新能源汽车的快速发展对研发测试提出了更高要求:复杂的电控系统、高实时性通信需求、多域融合的验证场景,以及快速迭代的开发周期。传统测…...
C/C++的条件编译
一、什么是条件编译? 条件编译是指在编译阶段根据某些条件来决定是否编译某段代码。这通常通过预处理指令来实现,比如 #if、#ifdef、#ifndef、#else、#elif 和 #endif。 二、为什么使用条件编译? 跨平台开发:不同的操作…...
使用 requests 和 BeautifulSoup 解析淘宝商品
以下将详细解释如何通过这两个库来实现按关键字搜索并解析淘宝商品信息。 一、准备工作 1. 安装必要的库 在开始之前,确保已经安装了 requests 和 BeautifulSoup 库。如果尚未安装,可以通过以下命令进行安装: bash pip install requests…...
安装 TabbyAPI+Exllamav2 和 vLLM 的详细步骤
在 5090 显卡上成功安装 TabbyAPIExllamav2 和 vLLM 并非易事,经过一番摸索,我总结了以下详细步骤,希望能帮助大家少走弯路。 重要提示: 用户提供的 PyTorch 安装使用了 cu128,这并非标准 CUDA 版本。请根据你的系统实…...
小动物多导生理记录仪产品需求定义
小动物多导生理记录仪的产品需求定义如下: 功能需求 信号采集功能:能采集多种生理信号,如心电、脑电、肌电、眼电、胃肠电、诱发电位、神经电位、细胞电位、有创血压、无创血压、dP/dt、体温、肌张力、呼吸波、呼吸流速、组织血流速度、血管…...
深入理解C++引用:从基础到现代编程实践
一、引用的本质与基本特性 1.1 引用定义 引用是为现有变量创建的别名,通过&符号声明。其核心特点: 必须初始化且不能重新绑定 与被引用变量共享内存地址 无独立存储空间(编译器实现) 类型必须严格匹配 int value 42; in…...
黑白彩色相机成像原理
文章目录 黑白相机成像原理彩色相机成像原理 黑白相机成像原理 参考:B站优致谱视觉 光线聚焦:相机镜头将外界景物反射的光线聚焦到相机内部的成像平面上。光电转换:成像平面上通常是图像传感器,黑白相机常用的是CCD(…...
室内指路机器人是否支持环境监测功能?
并非所有室内指路机器人都具备环境监测功能。那些支持环境监测的室内指路机器人,往往在设计上进行了针对性的优化,搭载了一系列先进且实用的传感器。温湿度传感器犹如一位敏锐的 “温度湿度侦探”,时刻精准地监测室内温度与湿度,为…...
去中心化自治组织(DAO):革新未来治理的下一站
去中心化自治组织(DAO):革新未来治理的下一站 引言 去中心化自治组织(DAO)的诞生,像是互联网时代的一道新曙光。它打破了传统组织的等级壁垒,以去中心化和智能合约为核心,让社区成员能够直接参与决策并共享收益。从NFT社区到投资基金,DAO的应用场景正以前所未有的速…...
Docker安装、配置Mysql5.7
1.创建必要的目录 # 创建目录 mkdir -p ~/docker/software/mysql/{conf,log,data} 2.如果没有docker-compose.yml文件的话,先创建docker-compose.yml 配置文件一般长这个样子 version: 3services:mysql:image: mysql:5.7.36container_name: mysqlports:- "…...
#管理Node.js的多个版本
在 Windows 11 上管理 Node.js 的多个版本,最方便的方法是使用 nvm-windows(Node Version Manager for Windows)。它允许你轻松安装、切换和管理多个 Node.js 版本。 📌 方法 1:使用 nvm-windows(推荐 ✅&a…...
基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)
目录 编辑 一、项目重构背景与技术选型 1.1 原代码问题分析 1.2 DrissionPage框架优势 二、环境配置与基础改造 2.1 依赖库安装 2.2 基础类改造 三、核心功能模块重构 3.1 请求参数自动化生成 3.2 智能页面渲染 3.3 数据解析优化 四、数据库操作增强 4.1 批量插入…...
Online Sparse Reconstruction for Scanning Radar Using Beam-Updating q-SPICE论文阅读
Online Sparse Reconstruction for Scanning Radar Using Beam-Updating q -SPICE 论文概述关键技术与创新点实验结果学术术语解释1. 论文的研究目标与实际问题2. 论文提出的新方法、模型与公式2.1 核心方法:Beam-Updating q-SPICE2.1.1 循环最小化(Cyclic Minimization)2.1…...
模运算核心性质与算法应用:从数学原理到编程实践
目录 🚀前言🌟数学性质:模运算的理论基石💯基本定义:余数的本质💯四则运算规则:保持同余性的关键 🦜编程实践:模运算的工程化技巧💯避免数值溢出:…...
MINIQMT学习课程Day8
获取qmt账号的资金账号后,我们进入下一步,如何获得当前账号的持仓情况 还是之前的步骤,打开qmt,选择独立交易, 之后使用pycharm,编写py文件。 from xtquant import xtdata from xtquant.xttrader import…...
【硬件模块】数码管模块
一位数码管 共阳极数码管:8个LED共用一个阳极 数字编码00xC010xF920xA430xB040x9950x9260x8270xF880x8090x90A0x88B0x83C0xC6D0xA1E0x86F0x8E 共阴极数码管:8个LED共用一个阴极 数字编码00x3F10x0620x5B30x4F40x6650x6D60x7D70x0780x7F90x6FA0x77B0x7…...
专为 零基础初学者 设计的最简前端学习路线,聚焦核心内容,避免过度扩展,帮你快速入门并建立信心!
第一阶段:HTML CSS(2-3周) 目标:能写出静态网页,理解盒子模型和布局。 HTML基础 常用标签:<div>, <p>, <img>, <a>, <ul>, <form> 语义化标签:<head…...
详解大模型四类漏洞
关键词:大模型,大模型安全,漏洞研究 1. 引入 promptfoo(参考1)是一款开源大语言模型(LLM)测试工具,能对 LLM 应用进行全面漏洞测试,它可检测包括安全风险、法律风险在内…...
.NET 调用API创建系统服务实现权限维持
在Windows操作系统中,Services服务以后台进程的形式运行的,通常具备非常高的权限启动和运行服务。因此红队往往利用.NET框架通过创建和管理Windows服务来实现权限维持。本文将详细介绍如何通过.NET创建Windows服务,以实现权限维持的基本原理和…...
CSS 创建与使用学习笔记
一、CSS 的作用 CSS(层叠样式表)用于控制 HTML 文档的样式和布局。当浏览器读取一个样式表时,它会根据样式表中的规则来格式化 HTML 文档,从而实现页面的美化和布局调整。 二、插入样式表的方法 CSS 可以通过以下三种方式插入到…...
使用Expo框架开发APP——详细教程
在移动应用开发日益普及的今天,跨平台开发工具越来越受到开发者青睐。Expo 是基于 React Native 的一整套工具和服务,它能够大幅降低原生开发的门槛,让开发者只需关注业务逻辑和界面实现,而不用纠结于复杂的原生配置。本文将从零开…...
Android Dagger 2 框架的注解模块深入剖析 (一)
本人掘金号,欢迎点击关注:https://juejin.cn/user/4406498335701950 一、引言 在 Android 开发中,依赖注入(Dependency Injection,简称 DI)是一种强大的设计模式,它能够有效降低代码的耦合度&…...
流媒体协议基础
流媒体协议基础 全文-流媒体协议基础 全文大纲 流媒体协议分类 RTMP:应用层协议,依赖Flash播放器插件,支持推、拉流。RTSP:应用层控制协议,用于播放、暂停、终止等指令控制,支持推、拉流。RTP:…...
Java全栈面试宝典:线程安全机制与Spring Boot核心原理深度解析
目录 一、Java线程安全核心原理 🔥 问题1:线程安全的三要素与解决方案 线程安全风险模型 线程安全三要素 synchronized解决方案 🔥 问题2:synchronized底层实现全解析 对象内存布局 Mark Word结构(64位系统&…...
