CCPC2025郑州F.幻形之路个人题解

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

F.幻形之路

#最短路 #BFS #dijkstra
![[Pasted image 20250614211629.png]]

![[Pasted image 20250614211647.png]]

思路

从起点走到终点的过程可以简化为:
起点→障碍物→k障碍物→终点 起点\to障碍物 \xrightarrow{k}障碍物\to 终点 起点障碍物k 障碍物终点
因此,只需要找到围住起点的一圈障碍物以及围住终点的一圈障碍物,随后求出这两圈之间的最短路即可!

找到这两圈障碍物可以采用BFS的方式,如果当前点是'#',那么就可以进行标记并continue;

求最短路可以使用Dijkstra或者继续BFS~

法一:Dijkstra
由于这是一个多起点(一圈障碍物)问题,所以开一个超级源点S0S_{0}S0,将所有的起点SiS_{i}Si与其建边,边权为0:S0→0SiS_{0}\xrightarrow{0}S_{i}S00 Si

其次将图上的所有点建边:Si→1S上、下、左、右S_{i}\xrightarrow{1}S_{上、下、左、右}Si1 S上、下、左、右

以超级源点S0S_{0}S0为起点跑一遍dj就可以快乐出答案啦!

值得一提的是,如果第一遍对最初的起点(1,1)(1,1)(1,1)BFS的时候已经遍历到了终点(n,m)(n,m)(n,m),那么应当直接输出0。
本人因为这个边界条件卡了快一个小时

法二:BFS
相比于dj,BFS不需要建边,但是更考验染色以及细节的处理

第一遍BFS的用vis数组标记,第二遍BFS用数组vis2标记

在队列deque中塞入所有的障碍物起点SiS_{i}Si,判断是否可以塞入队列的条件是vis数组,判断是否结束的条件是vis2数组:
如果BFS过程中,当前点(x,y)(x,y)(x,y)在vis2上已经被标记了,那么就说明已经找到了从障碍物起点到障碍物终点的最短路!直接输出步数step即可~

代码实现

Dijkstra

#include<iostream>
#include<vector>
#include<queue>

using namespace std;
#

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值