P1519 穿越栅栏 Overfencing 【洛谷算法习题】
P1519 穿越栅栏 Overfencing网页链接P1519 穿越栅栏 Overfencing题目描述Farmer John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是他所建造的迷宫是一个“完美的”迷宫即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W WW1 ≤ W ≤ 38 1 \leq W \leq 381≤W≤38及高度H HH1 ≤ H ≤ 100 1 \leq H \leq 1001≤H≤100。2 × H 1 2 \times H12×H1行每行2 × W 1 2 \times W12×W1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数即使从这一点以最优的方式走向最靠近的出口它仍然需要最多的步数。当然了牛们只会水平或垂直地在 X 或 Y 轴上移动他们从来不走对角线。每移动到一个新的方格算作一步包括移出迷宫的那一步。这是一个W 5 , H 3 W5,H3W5,H3的迷宫----- | | - - | | | | -- | | | - ---如上图的例子栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。输入格式第一行两个整数W , H W,HW,H。接下来2 × H 1 2 \times H12×H1行每行2 × W 1 2 \times W12×W1个字符描述一个迷宫。输出格式输出一个单独的整数表示最坏情况下牛走出迷宫的最小步数。输入输出样例 #1输入 #15 3 ----- | | - - | | | | -- | | | - ---输出 #19说明/提示翻译来自NOCOWUSACO 2.4解题思路本题是一个在字符迷宫中寻找最坏情况出口距离的搜索问题。核心在于将字符网格转化为可走的图然后以两个出口为起点进行多源 BFS求出每个格子到最近出口的最短距离最后取最大值并换算为实际步数。1. 问题等价转化迷宫表示给定W × H W \times HW×H的迷宫实际字符图为( 2 H 1 ) (2H1)(2H1)行、( 2 W 1 ) (2W1)(2W1)列。奇数行、奇数列是墙壁、-、|偶数行、偶数列是房间或通道。可走节点字符图中的空格 表示牛可以站立的格子。代码中把这些空格标记为vis[i][j]0表示可以通行。出口判定牛从迷宫边界上的空格走出迷宫。代码将位于网格边界第1行、最后一行、第1列、最后一列且是空格的格子视为出口记录其坐标并设初始距离为 1代表“移出迷宫的那一步”已计入。距离定义在字符网格中相邻可走空格之间的距离为 1。牛在迷宫中从一个房间移动到相邻房间在字符图上需要走两步例如从一个空格到隔壁空格中间隔着墙壁。因此在字符网格上计算出的最短路长度恰好是实际步数的 2 倍最终答案需除以 2。2. 算法实现多源 BFS建图与标记读入W , H W, HW,H后将其更新为字符图的真实宽高w 2*W1, h 2*H1。用getline按行读取迷宫对每行的每个字符判断若是空格则将vis[i][j]置为 0可走。如果该空格位于边界则将其记录为出口坐标存入ex[], ey[]同时初始化该点的dis 1。多源 BFS依次以每个出口为起点执行 BFS。使用队列queuendused数组控制访问去重每次 BFS 前清空。扩展四个方向如果邻居是未访问的可走节点更新其距离dis[nx][ny] min(dis[nx][ny], dis[cur.x][cur.y]1)并入队。两次 BFS 后dis数组即存储每个空格到最近出口的最短字符网格距离。答案提取遍历所有格子若dis[i][j]不为无穷大用其更新全局最大值ans。输出ans / 2即实际的最坏步数。3. 复杂度分析时间复杂度节点数上限约201 × 77 15477 201 \times 77 15477201×7715477每条边最多四个方向两次 BFS 总复杂度O ( W H ) O(WH)O(WH)完全可行。空间复杂度O ( W H ) O(WH)O(WH)存储距离与访问数组符合限制。总结通过将字符迷宫映射为网格图找出边界上的两个出口作为多源 BFS 起点计算出每个可走格子到出口的最短距离最大距离的一半即为从最糟糕点走出迷宫的最小步数。除以 2 的操作巧妙地将字符图上的两倍步长转化为实际移动步数。代码简要说明全局变量与方向数组dis[210][210]记录每个格子到最近出口的距离初始 INF。vis[210][210]1 表示墙0 表示可走的空格。used[210][210]单次 BFS 的访问标记。dx[], dy[]四个方向的移动增量。初始化init()先用cin.getline读取并丢弃输入缓冲中的换行符。循环h次读取迷宫行判断空格并标记vis[i][j]0。若空格在边界记录为出口设置dis[i][j]1。BFS 函数bfs(x, y)从出口(x,y)出发BFS 遍历所有连通的可走节点更新dis数组为更短距离。主函数逻辑读入W, H扩展为字符图尺寸。调用init()建图并寻找出口。对每个出口执行一次 BFS每次清空used。扫描全图求ans max(dis)输出ans/2。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll INF1e18;constll M1e610;constll mod1e97;constll dx[]{1,-1,0,0};constll dy[]{0,0,1,-1};chars[500];ll w,h,ans,cnt,ex[2],ey[2];ll dis[210][210],vis[210][210];boolused[210][210];structnd{ll x,y;}now;queuendq;voidinit(){cin.getline(s,500);for(ll i0;i210;i){fill(dis[i],dis[i]210,INF);fill(vis[i],vis[i]210,1);}for(ll i1;ih;i){cin.getline(s,500);for(ll j1;jw;j)if(s[j-1] ){vis[i][j]0;if((i1||j1||ih||jw)vis[i][j]0){ex[cnt]i;ey[cnt]j;dis[i][j]1;cnt;}}}}voidbfs(ll x,ll y){nd st;st.xx;st.yy;q.push(st);used[x][y]1;while(!q.empty()){nd curq.front();q.pop();for(ll i0;i4;i){ll nxcur.xdx[i],nycur.ydy[i];if(nx0nxhny0nywvis[nx][ny]0used[nx][ny]0){used[nx][ny]1;dis[nx][ny]min(dis[nx][ny],dis[cur.x][cur.y]1);now.xnx;now.yny;q.push(now);}}}}intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cinwh;w2*w1;h2*h1;init();for(ll i0;icnt;i){bfs(ex[i],ey[i]);for(ll j0;j210;j)fill(used[j],used[j]210,0);}for(ll i1;ih;i)for(ll j1;jw;j)if(dis[i][j]INF)ansmax(ans,dis[i][j]);coutans/2endl;return0;}

相关新闻

AI搜索数据异常波动如何秒级定位?——7个被90%团队忽略的埋点盲区与实时诊断公式

AI搜索数据异常波动如何秒级定位?——7个被90%团队忽略的埋点盲区与实时诊断公式

更多请点击: https://kaifayun.com 第一章:AI搜索数据异常波动的典型特征与业务影响 AI搜索系统在高并发、多模态查询场景下,常出现难以归因的数据波动。这类波动并非随机噪声,而是具备可识别的时序模式与分布特征,直…

2026/9/24 16:32:04 阅读更多 →
AI营销中的GEO技术:精准触达与转化提升

AI营销中的GEO技术:精准触达与转化提升

1. 原圈科技GEO解密:AI营销变革的核心逻辑 在营销技术领域,原圈科技的GEO系统正引发一场静悄悄的革命。这套系统本质上是通过地理围栏技术(Geo-fencing)结合AI算法,实现对目标用户的精准识别和场景化触达。我曾在三个不…

2026/9/24 14:58:38 阅读更多 →
深入解析I2C从机寄存器组:从数据交换到中断与FIFO配置

深入解析I2C从机寄存器组:从数据交换到中断与FIFO配置

1. I2C从机通信的核心:寄存器组概览与设计哲学在嵌入式开发中,I2C总线因其简洁的两线制(SDA和SCL)和灵活的多主多从架构,成为了连接微控制器与各类传感器、存储器、IO扩展芯片的首选协议。当你需要让一个微控制器&…

2026/9/24 14:50:50 阅读更多 →

最新新闻

从烘焙到Lumen:Unity与UE4全局光照技术对比

从烘焙到Lumen:Unity与UE4全局光照技术对比

1. 这轮对比的背景:PBR之后,光照才是渲染的真战场1.1 为什么Part2要单独写全局光照Part1我们聊了Unity URP、HDRP和UE4在PBR材质模型、Shader着色、法线细节上的差异。评论区不少人问:材质表现都差不多了,为什么画面放在一起还是差…

2026/9/25 5:47:35 阅读更多 →
mac配置GLSL(OpenGL Shading Language)开发环境:TaoToken统一Key接入vscode与glslang校验

mac配置GLSL(OpenGL Shading Language)开发环境:TaoToken统一Key接入vscode与glslang校验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 5:47:35 阅读更多 →
Databasus 仓库 Git 提交规范:FEATURE/FIX/REFACTOR 前缀、分支命名与自动化版本发布工作流

Databasus 仓库 Git 提交规范:FEATURE/FIX/REFACTOR 前缀、分支命名与自动化版本发布工作流

数据库灾备 【免费下载链接】databasus PostgreSQL backup tool with Point-In-Time-Recovery and restore verification 项目地址: https://gitcode.com/gh_mirrors/po/databasus 点击查看 免费下载 本篇指南完整讲解 Databasus 开源仓库的 Git 提交与分支命名约定…

2026/9/25 5:47:35 阅读更多 →
ng-zorro-antd DatePicker 禁用状态实战:nzDisabled、nzDisabledDate 与 nzDisabledTime 全解析

ng-zorro-antd DatePicker 禁用状态实战:nzDisabled、nzDisabledDate 与 nzDisabledTime 全解析

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 本文围绕 ng-zorro-antd 日期选择器(DatePicker)官方示例 禁…

2026/9/25 5:47:35 阅读更多 →
SSE流式传输实战:AI响应、Nginx配置与EventSource健壮封装

SSE流式传输实战:AI响应、Nginx配置与EventSource健壮封装

1. 为什么今天还必须亲手写一个 SSE 服务?不是 WebSocket 更香吗? SSE(Server-Sent Events)这个词最近在 AI 应用开发一线高频出现,但很多人其实只停留在“它能流式输出大模型回答”这个表层认知。我去年带团队重构三…

2026/9/25 5:47:35 阅读更多 →
使用 VoltAgent 构建 YouTube 转博客 Agent:MCP 工具、共享记忆与 Supervisor 编排实战

使用 VoltAgent 构建 YouTube 转博客 Agent:MCP 工具、共享记忆与 Supervisor 编排实战

人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆 【免费下载链接】voltagent AI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework 项目地址: https://gitcode.com/gh_mirrors/vo/voltagent 点击查看 免费下载 本…

2026/9/25 5:46:34 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →